以下是题面(POJ3074数独):
给出若干组数独的数据,求完整的数独方案。
多组数据,每组数据在一行上输入81个字符,可以是数字1-9,未填数字的格子用句点'.';表示。第1-9个数字表示第1行,接下来9个数字表示第2行,其余的以此类推。
最后一组数据后,用单词end表示结束。
每组数据输出一行,是一个完整的数独方案。数据保证答案唯一。
.2738..1..1...6735.......293.5692.8...........6.1745.364.......9518...7..8..6534.
......52..8.4......3...9...5.1...6..2..7........3.....6...1..........7.4.......3.
end
527389416819426735436751829375692184194538267268174593643217958951843672782965341
416837529982465371735129468571298643293746185864351297647913852359682714128574936
原题在 here
#include<bits/stdc++.h>
#define MAXN 150
#define MAXST 100
using namespace std;
int n=9,a[MAXN][MAXN];
char st[MAXST];
bool h[MAXN][MAXN];
bool l[MAXN][MAXN];
bool jgg[MAXN][MAXN];
int lw;
bool yuan[MAXN][MAXN];
struct node{
int x,y;
}w[MAXN*MAXN];
int zh(int x,int y)
{
if(x>=1&&x<=3)
{
if(y>=1&&y<=3)
{
return 1;
}
else if(y>=4&&y<=6)
{
return 2;
}
else
{
return 3;
}
}
else if(x>=4&&x<=6)
{
if(y>=1&&y<=3)
{
return 4;
}
else if(y>=4&&y<=6)
{
return 5;
}
else
{
return 6;
}
}
else
{
if(y>=1&&y<=3)
{
return 7;
}
else if(y>=4&&y<=6)
{
return 8;
}
else
{
return 9;
}
}
}
void dfs(int x,int y,int k)
{
for(int q=1;q<=9;q++)
{
if(!h[x][q]&&!l[y][q]&&!jgg[zh(x,y)][q])
{
h[x][q]=1;
l[y][q]=1;
jgg[zh(x,y)][q]=1;
a[x][y]=q;
k++;
if(k<=lw) dfs(w[k].x,w[k].y,k);
k--;
h[x][q]=0;
l[y][q]=0;
jgg[zh(x,y)][q]=0;
}
}
}
void solve()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i][j]==-2) w[++lw].x=i,w[lw].y=j;
else
{
h[i][a[i][j]]=1;
l[j][a[i][j]]=1;
jgg[zh(i,j)][a[i][j]]=1;
}
}
}
dfs(w[1].x,w[1].y,1);
return;
}
void print()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
printf("%d ",a[i][j]);
}
putchar('\n');
}
return;
}
void reset()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
h[i][j]=l[i][j]=jgg[i][j]=0;
}
}
lw=0;
return;
}
int main()
{
scanf("%s",st);
while(1)
{
if(st[0]=='e') break;
int x=1,y=0;
for(int i=0;i<strlen(st);i++)
{
y++;
if(y>9)
{
y=1;
x++;
}
a[x][y]=st[i]-48;
}
solve();
print();
reset();
scanf("%s",st);
}
return 0;
}