数独问题

来源:互联网 发布:淘宝店铺修改退货地址 编辑:程序博客网 时间:2024/05/22 15:56

数独游戏规则
在9阶方阵中,包含了81个小格(九列九行),其中又再分成九个小正方形(称为宫),每宫有九小格。
游戏刚开始时,盘面上有些小格已经填了数字(称为初盘),游戏者要在空白的小格中填入1到9的数字,
使得最后每行、每列、每宫都不出现重复的数字,而且每一个游戏都只有一个唯一的解答(称为终盘)。

输入:

一个9*9的矩阵,0表示该位置是空白。

输出:

一个9*9的矩阵,格式与输入类似。

输入样例:

900050060020070100300102040703800529000345000516009403050208006007090010030010004

输出样例:

971453268428976135365182947743861529892345671516729483154238796687594312239617854


#include<iostream>

using namespace std;
int a[9][9];
char ab[9][9];
void init();
void search(int m);
void output();
int canplace(int row,int col,int num);


int main()
{
init();
search(0);
return 0;
}
void init()
{
int i,j;
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
cin>>ab[i][j];
a[i][j]=ab[i][j]-'0';

}
}
void search(int m)
{
int row,col,i;
if(m==81)
{
output();
}
else
{
row=m/9;
col=m%9;
if(a[row][col]!=0)
{
search(m+1);
}
else if(a[row][col]==0)
{
for(int i=1;i<=9;i++)
{
if(canplace(row,col,i))
{
a[row][col]=i;
search(m+1);
a[row][col]=0;
}
}
}
}
}
int canplace(int row,int col,int num)
{
int i,j;
int flag=1;
for(i=0;i<9;i++)
{
if(a[row][i]==num||a[i][col]==num)
{
flag=0;
break;
}
}
if(flag==1)
{
for(i=(row/3)*3;i<=(row/3)*3+2;i++)
{
for(j=(col/3)*3;j<=(col/3)*3+2;j++)
{
if(a[i][j]==num)
{
flag=0;
break;
}
}
if(flag==0)
{
break;
}
}
}
return flag;
}
void output()
{
int i,j;
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
if(j==8)
{
cout<<a[i][j]<<endl;
}
else
{
cout<<a[i][j];
}
}
}
}











原创粉丝点击