您的位置:首页 > 编程语言 > C语言/C++

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);
}
}

}
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: