题目就是解数独 思路很直接:DFS
用row[i][x] //表示第i行中x出现过
col[j][y]//表示第j列中y出现过
grid[k][z]//表示第k个格子z出现过
k=3*((i-1)/3)+(j-1)/3+1//具体推导过程见
http://blog.csdn.net/lyy289065406/article/details/6647977
如果嫌推导麻烦的话可以直接if(i<=3&&i>=1&&j>=1&&j<=3) k=1;这样来判断。
好了贴代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;
int a[10][10];
int row[10][10];
int col[10][10];
int grid[10][10];
#define MS(a,b) memset(a,b,sizeof(a))
int judge(int x,int y,int k,int z)//判断z是否能填进a[x][y]
{
if(row[x][z]==1)
return 0;
if(col[y][z]==1)
return 0;
if(grid[k][z]==1)
return 0;
return 1;
}
void init(int x,int y,int k,int z)//如果填进了就要标记
{
row[x][z]=1;
col[y][z]=1;
grid[k][z]=1;
}
void re(int x,int y,int k,int z)//回溯
{
row[x][z]=0;
col[y][z]=0;
grid[k][z]=0;
}
int flag;
void dfs(int x,int y)
{
int k=3*((x-1)/3)+(y-1)/3+1;
if(x==10)//搜完整个了
{
flag=1;
return ;
}
if(flag)
return ;
if(a[x][y])//如果原本就有数的话就不用填数
{
if(y<9)
dfs(x,y+1);
else
dfs(x+1,1);
if(flag)
return ;
}
else
for(int i=1;i<=9;i++)
{
if(judge(x,y,k,i))
{
a[x][y]=i;
init(x,y,k,i);
if(y<9)
dfs(x,y+1);
else
dfs(x+1,1);
if(flag)
return ;
else
a[x][y]=0;//回溯
re(x,y,k,i);
}
}
return ;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
MS(row,0);//初始化
MS(col,0);
MS(grid,0);
for(int i=1;i<=9;i++)
{
for(int j=1;j<=9;j++)
{
scanf("%1d",&a[i][j]);
int k=3*((i-1)/3)+(j-1)/3+1;
init(i,j,k,a[i][j]);
}
}
flag=0;
dfs(1,1);
for(int i=1;i<=9;i++)
{
for(int j=1;j<9;j++)
{
printf("%d",a[i][j]);
}
printf("%d\n",a[i][9]);
}
}
return 0;
}</span>