您的位置:首页 > 其它

数独问题。。。。。。dfs+暴力搜索- -诶,只能这个水平了。。

2012-11-17 09:38 716 查看


/************************ 数独问题 ***************************/
/*** 此程序可以解出任何一个数独的一个解,如果存在的话。 ***/
/********** 输入时请直接输入9*9的矩阵,空白处填0 ***********/
/********************** 2012-11-06 ***************************/

#include <iostream>
using namespace std;

int data[9][9];
int put[81][2];
int total;

bool judge(int i,int j,int k)
{
for (int l=0;l<=8;l++)
if (data[i][l]==k || data[l][j]==k) return false;
int x=(i/3)*3,y=(j/3)*3;
for (int l=x;l<=x+2;l++)
for (int m=y;m<=y+2;m++)
if (data[l][m]==k) return false;
return true;
}

void print()
{
for (int i=0;i<=8;i++)
{
for (int j=0;j<=8;j++)
{
cout << data[i][j];
if (j==2 || j==5) cout << " |";
if (j!=8) cout << " ";
}
cout << endl;
if (i==2 || i==5) cout << "- - - + - - - + - - -" << endl;
}
}

bool dfs(int l)
{
if (l==total)
return true;
else
{
for (int k=1;k<=9;k++)
{
if (judge(put[l][0],put[l][1],k))
{
data[put[l][0]][put[l][1]]=k;
if (dfs(l+1)) return true;
data[put[l][0]][put[l][1]]=0;
}
}
}
return false;
}

int main()
{
int c;
while (cin >> c)
{
total=0;
for (int i=0;i<=80;i++)
{
int j=i/9,k=i%9;
if (i!=0 || j!=0) cin >> c;
data[j][k]=c;
if (c==0)
{
total++;
put[total-1][0]=j;put[total-1][1]=k;
}
}
cout << endl;
if (dfs(0))
print();
else
cout << "No solution!!" << endl;
cout << "-------------------------------------" << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: