C语言——解数独程序[源码]

article/2025/10/2 2:28:27

用C语言写的解数独的程序。在linux下测试成功运行。

效果如图:

这是带解的数独,需要填写的部分用数字0代替。

这是程序运行后的效果图。看看,数独已经搞定啦~~~


程序源码如下:

#include <stdio.h>
#include <stdlib.h>#define SIZE 9
#define get_low_bit(x) ((~x&(x-1))+1)struct{int left;char num;	char try;
}board[SIZE][SIZE];int bit2num(int bit)
{switch(bit){case 1:case 2:return bit;	case 4:return 3;case 8:return 4;case 16:return 5;case 32:return 6;	case 64:		return 7;	case 128:return 8;	case 256:return 9;}	
}void printf_res()
{int i, j, k;	for(i=0; i<SIZE; i++){if(i%3==0)	{for(j=0; j<SIZE*2+4; j++)putchar('-');putchar('\n');}		for(j=0; j<SIZE; j++){if(j%3==0)putchar('|');if(board[i][j].num > 0)printf("\033[0;31m%2d\033[0m", board[i][j].num);elseprintf("%2d", board[i][j].try);}	printf("|\n");}for(i=0; i<SIZE*2+4; i++)putchar('-');putchar('\n');
}void sub(int i, int j, int bit)
{int k, m;	for(k=0; k<SIZE; k++){board[k][j].left &= ~bit;board[i][k].left &= ~bit;}		for(k=i/3*3; k<(i/3+1)*3; k++)for(m=j/3*3; m<(j/3+1)*3; m++)board[k][m].left &= ~bit;	
}void init()
{int i, j;	for(i=0; i<SIZE; i++)for(j=0; j<SIZE; j++)if(board[i][j].num > 0)sub(i, j, 1<<(board[i][j].num-1));else if(board[i][j].try > 0)sub(i, j, 1<<(board[i][j].try-1));
}void add(int i, int j, int bit)
{int k, m;for(k=0; k<SIZE; k++){board[k][j].left |= bit;board[i][k].left |= bit;}for(k=i/3*3; k<(i/3+1)*3; k++)for(m=j/3*3; m<(j/3+1)*3; m++)board[k][m].left |= bit;
}void solve(int pos)
{int i=pos/SIZE;	int j=pos%SIZE;	int bit, left;if(pos == SIZE*SIZE){printf_res();exit(0);		}if(board[i][j].num > 0)solve(pos+1);	elsefor(left=board[i][j].left; left; left&=(left-1)){bit = get_low_bit(left);sub(i, j, bit);board[i][j].try = bit2num(bit);solve(pos+1);add(i, j, bit);board[i][j].try=0;init();		}		
}int main()
{int i, j, c;for(i=0; i<SIZE; i++)for(j=0; j<SIZE; j++){while((c=getchar())<'0' || c>'9');board[i][j].num = c-'0';board[i][j].try = 0;board[i][j].left = 0x0001FF;		}				init();solve(0);return 0;
}


http://chatgpt.dhexx.cn/article/MhZYMIFd.shtml

相关文章

用 Python 解数独(Sudoku)

芬兰数学家因卡拉花费3个月时间设计出的世界上迄今难度最大的数独。数独是 9 横 9 竖共有 81 个格子&#xff0c;同时又分为 9 个九宫格。规则很简单&#xff1a;每个空格填入 1~9 任意一个数字&#xff0c;需要保证每个横排和竖排以及九宫格内无相同数字。 解数独是一个可有可…

解数独c++

解数独 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考示例图&#xff09; 数…

MATLAB 解数独

数独是一种较为常见的游戏&#xff0c;一般有4乘4、6乘6、9乘9几种&#xff0c;就像下面这种&#xff0c;本文也是主要求解此类数独。 此外还有一些奇形怪状的&#xff0c;如下图两种&#xff0c;均是不规则的&#xff0c;在此并不会涉及&#xff0c;但会在以后发布代码以及过程…

Leetcode 解数独

解数独 题目描述&#xff1a; 编写一个程序&#xff0c;通过填充空格来解决数独问题。一个数独的解法需遵循如下规则&#xff1a;数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。提示&#xff1a;…

再战leetcode (解数独)

37. 解数独 题目描述 回溯法 leetcode题解 代码 public class Test {public static void main(String[] args) {char[][] board {{5, 3, ., ., 7, ., ., ., .},{6, ., ., 1, 9, 5, ., ., .},{., 9, 8, ., ., ., ., 6, .},{8, ., ., ., 6, ., ., ., 3},{4, ., ., 8, ., 3, .…

回溯算法解数独问题(java版)

下面来详细讲一下如何用回溯算法来解数独问题。 下图是一个数独题&#xff0c;也是号称世界上最难的数独。当然了&#xff0c;对于计算机程序来说&#xff0c;只要算法是对的&#xff0c;难不难就不知道了&#xff0c;反正计算机又不累。回溯算法基本上就是穷举&#xff0c;解这…

014. 解数独

1.题目链接&#xff1a; 37. 解数独 2.解题思路&#xff1a; 2.1.题目要求&#xff1a; 暂时的理解就是&#xff0c;编写一个程序然后自动填完数独&#xff0c;填完返回&#xff08;不用求解各种不同的数独组合&#xff09; 填的时候&#xff0c;数字要满足的规则&#xff1…

回溯算法—解数独

什么是回溯法&#xff1f; 回溯法&#xff08;探索与回溯法&#xff09;是一种选优搜索法&#xff0c;又称为试探法&#xff0c;按选优条件向前搜索&#xff0c;以达到目标。但当探索到某一步时&#xff0c;发现原先选择并不优或达不到目标&#xff0c;就退回一步重新选择&…

解数独--难的一批

1题目 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&#xff08;请参考示例图&#xff09; 数…

解数独 — Python

文章目录 解数独1、程序简介示例&#xff1a;输入&#xff1a;输出&#xff1a;解释&#xff1a;提示&#xff1a; 2、程序代码3、运行结果 解数独 1、程序简介 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每…

【每日刷题】解数独

题目地址 https://leetcode-cn.com/problems/sudoku-solver/ 题目描述&#xff1a;解数独 编写一个程序&#xff0c;通过已填充的空格来解决数独问题。 一个数独的解法需遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-…

算法学习:37. 解数独

解数独 题目链接&#xff1a;力扣题目链接 难度&#xff1a;困难 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫…

数独解题方法大全

数独这个数字解谜游戏&#xff0c;完全不必要用到算术&#xff01;会用到的只是推理与逻辑。解题方法分两大类&#xff1a;直观法和候选数法。 直观法就是不需要任何辅助工具&#xff0c;从接到数独谜题的那一刻起就可以立即开始解题。绝不猜测。数独直观法解题技巧主要有&…

37.解数独

37. 解数独&#xff08;难度&#xff1a;困难&#xff09; 题目链接&#xff1a;https://leetcode-cn.com/problems/sudoku-solver/ 编写一个程序&#xff0c;通过已填充的空格来解决数独问题。 一个数独的解法需遵循如下规则&#xff1a; 数字 1-9 在每一行只能出现一次。数…

安装搜狗输入法成功,每次都折腾,记录一下这次的成功经验。

1&#xff1a;卸载fcitx sudo apt-get --purge fcitx* 2&#xff1a;清理系统内的无用的软件包 sudo apt-get --purge autoremove 3&#xff1a;到搜狗官网下载搜狗拼音输入法&#xff0c;选择你系统对应的软件包&#xff0c;我系统是64位的&#xff0c;所以我选择了amd64的 ht…

Ubuntu16.04 python2.7升级python3.5

原文地址&#xff1a;https://www.cnblogs.com/wmr95/p/7637077.html Ubuntu16.04 python2.7升级python3.5 正常情况下&#xff0c;你安装好ubuntu16.04版本之后&#xff0c;系统会自带 python2.7版本&#xff0c;如果需要下载新版本的python3.5&#xff0c;就需要进行更新。下…

(转)解决Ubuntu2.6.31-20内核更新问题:Unable to mount root fs on unknown-block(x,x)

原文章&#xff1a;http://hi.baidu.com/%D2%BB%B5%E3%C7%E7/blog/item/d3b0df30da10a115ebc4afa3.html Ubuntu2.6.31-20内核更新问题&#xff1a;Unable to mount root fs on unknown-block(x,x) WUBI装的ubuntu。在更新了最信的内核 2.6.31-20&#xff0c;启动时出现提示&a…

Git客户端的简单使用(注册-gt;应用)

参考文档&#xff1a; Ubuntu下git安装与使用&#xff1a;https://jingyan.baidu.com/article/dca1fa6f43c965f1a540524d.html Ubuntu下使用SSH KEY&#xff1a;https://jingyan.baidu.com/article/5bbb5a1bff545613eba17915.html 1. 通过apt源安装git命令行工具 这里不建…

windows10下的Ubuntu18.04的双系统的安装

windows下装Ubuntu18.04的双系统作为菜鸟&#xff0c;照着大神们的教程装了几遍&#xff0c;给大家分享一下流程。&#xff08;默认装好Windows10&#xff09; 1.【Win10上安装的软件】可在Win10上提前下载安装EasyBCD软件&#xff0c;用于之后开机时的双系统切换&#xff1b;…

[Linux 基础] -- Linux DRM (二) 基本概念和特性 - Rockchip

一、楔子 上篇文章中我们有讲过 DRM 是 Linux 下的图形渲染架构&#xff0c;用来管理显示输出、图层合成与更新、内存管理、分辨率设置等等功能的一套显示管理框架。应用程序可以直接操纵 drm 的 ioctl 或者是用 framebuffer 提供的接口进行显示相关操作。后来大家觉得这样太 …