c语言编写求解数独
2016-04-09 21:18
405 查看
大一的第一个解决问题的程序,递归操作,很久才搞定这个程序。--
输入格式为9*9的 数字矩阵 如果没有填入数字则用0代替,用递归求解 对每个格子进行1 - 9 的尝试填入 递归操作 直到81个格子全部填入成功,输出第一个解。如果填某个格子发现不正确的时候退出这层递归返回上层。
代码如下
</pre><pre name="code" class="objc">#include <stdio.h>
#define FOR(i, x, y) for(i = x; i <= y; ++i)
int result = 1;
void start (int a[9][9],int n);
int check(int a[9][9],int i,int j, int k);
void output(int a[9][9]);
int main()
{
int a[9][9];
int i,j;
FOR(i, 0, 8)
FOR(j, 0, 8)
scanf("%d",&a[i][j]);
start (a,0);
return 0;
}
void output(int a[9][9])
{
result--; //只需要输出第一个解
int i ,j;
FOR(i, 0, 8)
{
FOR(j, 0, 8)
printf("%d ",a[i][j]);
printf("\n");
}
}
int check (int a[9][9],int i,int j,int k)
{
int i1,j1,p,q;
FOR(p, 0, 8)
if (a[p][j] == k)
return 0;
FOR(q, 0, 8)
if (a[i][q] == k) //检测行与列
return 0;
i1 = i / 3 * 3;
j1 = j / 3 * 3; //检测九宫格
FOR(p, i1, i1 + 2)
FOR(q, j1, j1 + 2)
if (a[p][q] == k)
return 0;
return 1;
}
void start (int a[9][9], int n)
{
int r[9][9],p,q;
FOR(p, 0, 8)
FOR(q, 0, 8)
r[p][q] = a[p][q];
int i = n / 9;
int j = n % 9;
if (r[i][j] != 0)
{
if (n == 80)
output(r);
else start(r,n+1);
}
else if (a[i][j] == 0 && result == 1)
{
FOR(p, 1, 9)
{
if (check (r, i, j, p))
{
r[i][j] = p;
if (n == 80)
output(r);
else start (r , n+1);
}
}
}
}
输入格式为9*9的 数字矩阵 如果没有填入数字则用0代替,用递归求解 对每个格子进行1 - 9 的尝试填入 递归操作 直到81个格子全部填入成功,输出第一个解。如果填某个格子发现不正确的时候退出这层递归返回上层。
代码如下
</pre><pre name="code" class="objc">#include <stdio.h>
#define FOR(i, x, y) for(i = x; i <= y; ++i)
int result = 1;
void start (int a[9][9],int n);
int check(int a[9][9],int i,int j, int k);
void output(int a[9][9]);
int main()
{
int a[9][9];
int i,j;
FOR(i, 0, 8)
FOR(j, 0, 8)
scanf("%d",&a[i][j]);
start (a,0);
return 0;
}
void output(int a[9][9])
{
result--; //只需要输出第一个解
int i ,j;
FOR(i, 0, 8)
{
FOR(j, 0, 8)
printf("%d ",a[i][j]);
printf("\n");
}
}
int check (int a[9][9],int i,int j,int k)
{
int i1,j1,p,q;
FOR(p, 0, 8)
if (a[p][j] == k)
return 0;
FOR(q, 0, 8)
if (a[i][q] == k) //检测行与列
return 0;
i1 = i / 3 * 3;
j1 = j / 3 * 3; //检测九宫格
FOR(p, i1, i1 + 2)
FOR(q, j1, j1 + 2)
if (a[p][q] == k)
return 0;
return 1;
}
void start (int a[9][9], int n)
{
int r[9][9],p,q;
FOR(p, 0, 8)
FOR(q, 0, 8)
r[p][q] = a[p][q];
int i = n / 9;
int j = n % 9;
if (r[i][j] != 0)
{
if (n == 80)
output(r);
else start(r,n+1);
}
else if (a[i][j] == 0 && result == 1)
{
FOR(p, 1, 9)
{
if (check (r, i, j, p))
{
r[i][j] = p;
if (n == 80)
output(r);
else start (r , n+1);
}
}
}
}
相关文章推荐
- 最大子数组(C语言)
- C++中不能声明为虚函数的有哪些函数
- C++作业3
- C++ STL pair
- 2017京东实习生笔试题(三)
- 全排列的递归和非递归实现(permutation)(C++)
- C++实现——旋转数组中找最小值
- c++模板实现队列
- C++实现——二叉树的四种遍历(非递归写法)
- 在c语言学习中的问题(一):数组指针,指针数组,二维数组的理解与区分
- c++第三次实验——作业
- C++——多次free和delete导致错误
- Let's Complain the Irresponsible keyword 'const' in C++
- c++作业3
- C++泛型之求未知数组的长度
- C++实验三
- c++模板实现栈
- 2016年蓝桥杯C++/c B组答案
- Getting Started with C++ in Visual Studio
- C++类内存分布