#include "stdafx.h"
#include <iostream>
using namespace std;
int integers[9][9];
int n=0;
int v[81];
int k=0;
int dn[81][1]={{0}};
bool is_or_not(int y,int x) //该空填的数字是否符合要求
{
int m=y/9;
int n=y%9;
int m1 = y / 9 / 3 * 3;
int n1 = y % 9 / 3 * 3;
for(int row=0;row!=9;row++)
if(integers[m][row]==x)
return false;
for(int col=0;col!=9;col++)
if(integers[col][n]==x)
return false;
for (int row=m1;row!=m1+3;row++)
for (int col=n1;col!=n1+3;col++)
if (integers[row][col] == x)
return false;
return true;
}
void show(int integers[9][9])
{
for(int i=0;i!=9;i++)
{
for(int j=0;j!=9;j++)
{
cout<<integers[i][j]<<" ";
if(j%3==2)
cout<<" ";
}
if(i%3==2)
cout<<endl;
}
}
/* 81个空依次试探,若空,则填入1-9最小合适的数。
如果到某一空1-9都不合适时,则回溯到前一个填的空,清零把原来填的数加1继续试探填入,依次类推。
*/
int Letsgo()
{
int i;
while(n<81)
{
while(integers[n/9][n%9]!= 0) //找为0的空格
{
n++;
if(n>80)
return 0;
}
for(i=dn[n][0]+1;i<=9;i++)
{
if (is_or_not(n,i))
{
integers[n/9][n%9]=i;
v[k++]=n; //记录填的哪个空格
dn[n][0]=i;//它填的值
n++;
if(n>80)
return 0;
break;
}
else if(i==9) //1-9都不符合要求
{
n=v[--k]; //返回上个空格,重新计算
integers[n/9][n%9]=0;
}
}
}
show(integers);//输出
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"请输入9*9=81个数字,空的用0代替:"<<endl;
//for example
//269030817070120004004789006701050962000000000582060401600392500900041070453070129
char tmp[9][9];
for(int i=0;i!=9;i++)
for(int j=0;j!=9;j++)
{
cin>>tmp[i][j];
integers[i][j]=tmp[i][j]-'0';
}
Letsgo();
cout<<"complete!"<<endl;
return 0;
}
有人知道吗,高手们,怎么运行不出来呀
Hello ,Buddy!稍作修改之后可以正常运行,但只是原样输出所输入的数,好像计算没起作用。
再有v[81]存的是每个填空的记录,按道理最坏情况下返回到第一个填的空就能找到要填的数,不会在向前回溯。你能运行出来了吗
不递归怎么可能成功。优化就是从判定限制最少的格子上入手的。
C++编程数独问题,非递归算法 下面是源代码,就是Letsgo()函数有问题...
else if(i==9) \/\/1-9都不符合要求 { \/\/\/ if(k<=0)return -1;\/\/\/