C语言 数独 递归

1202.数独游戏

时限:1000ms 内存限制:10000K  总时限:3000ms
描述
数独游戏规则 
在9阶方阵中,包含了81个小格(九列九行),其中又再分成九个小正方形(称为宫),每宫有九小格。 
游戏刚开始时,盘面上有些小格已经填了数字(称为初盘),游戏者要在空白的小格中填入1到9的数字,
使得最后每行、每列、每宫都不出现重复的数字,而且每一个游戏都只有一个唯一的解答(称为终盘)。
 
输入
一个9*9的矩阵,0表示该位置是空白。
 
输出
一个9*9的矩阵,格式与输入类似。
 
输入样例
900050060
020070100
300102040
703800529
000345000
516009403
050208006
007090010
030010004
 
输出样例
971453268
428976135
365182947
743861529
892345671
516729483
154238796
687594312
239617854
 


#include<stdio.h>


int a[9][9];


void search(int m);
int test(int n);
void output();


int main()
{
int i,j;
char b[9][10];//每行以字符串形式输入,多出一列放换行

for(int i=0;i<9;i++)
{
for(int j=0;j<=9;j++)
{
scanf("%c",&b[i][j]);
if(b[i][j]!='\n')
{
a[i][j]=b[i][j]-'0';
}
}
}

search(0);

return 0;



void search(int m)
{
int i;
if(m>=1&&m<=81)
{
if(test(m-1)==0) return;//检查m-1是否符合要求
}
if(m==81)
{
output();
}
if(m>=0&&m<=80)
{
int x=m/9,y=m%9;
if(a[x][y]!=0)
{
search(m+1);
}
if(a[x][y]==0)
{
for(int i=1;i<=9;i++)
{
a[x][y]=i;
search(m+1);
}
a[x][y]=0;
}
}
}


int test(int n)
{
int x=n/9;
int y=n%9;
int i,j;
for(i=0;i<=8;i++)
{
if(i!=x&&a[i][y]==a[x][y]) return 0;
}
for(j=0;j<=8;j++)
{
if(j!=y&&a[x][j]==a[x][y]) return 0;
}
int l=(x/3)*3,c=(y/3)*3;
for(i=l;i<=l+2;i++)
{
for(j=c;j<=c+2;j++)
{
if((i!=x||j!=y)&&a[i][j]==a[x][y]) return 0;
}
}
return 1;
}


void output()
{
int i,j;

for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
printf("%d",a[i][j]);
}
printf("\n");
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值