题意:
额,题意就是数独,大家都玩过,添数独。
做法:
从头往后搜数独中不存在的数,每个数都有1~9,9种情况。对于每一种情况,先看一下这个位置是否可以放这个数。
如果可以放的话,就放下去,继续搜下一个数,如果不可以,就放下一步。
注意:
注意搜到就要及时退出。否则就要超时。
还有从后往前搜是0MS,从前往后搜就是468MS。。。囧
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int map[10][10];
int maps[10][10];
int xlen[10][10];
int ylen[10][10];
int len[50][10];
int search(int x,int y)
{
int i,j;
if(x==0)
{
for(i=1;i<=9;i++)
{
for(j=1;j<=9;j++)
{
maps[i][j]=map[i][j];
}
}
return 1;
}
int xx,yy;
if(y==1)xx=x-1,yy=9;
else
{
xx=x;
yy=y-1;
}
if(map[x][y])return search(xx,yy);
else
{
for(i=1;i<=9;i++)
{
int num=((x-1)/3+1)*10+(y-1)/3+1;
if(!xlen[x][i]&&!ylen[y][i]&&!len[num][i])
{
map[x][y]=i;
xlen[x][i]=1;
ylen[y][i]=1;
len[num][i]=1;
if(search(xx,yy))
return 1;
map[x][y]=0;
xlen[x][i]=0;
ylen[y][i]=0;
len[num][i]=0;
}
}
}
return 0;
}
int main()
{
int n,i,j,a;
char c;
cin>>n;
getchar();
while(n--)
{
memset(map,0,sizeof(map));
memset(xlen,0,sizeof(xlen));
memset(ylen,0,sizeof(ylen));
memset(len,0,sizeof(len));
for(i=1;i<=9;i++)
{
for(j=1;j<=9;j++)
{
cin>>c;
a=c-'0';
map[i][j]=a;
xlen[i][a]=1;
ylen[j][a]=1;
len[((i-1)/3+1)*10+(j-1)/3+1][a]=1;
}
getchar();
}
int leap;
leap=search(9,9);
for(i=1;i<=9;i++)
{
for(j=1;j<=9;j++)
{
printf("%d",maps[i][j]);
}
puts("");
}
}
}