题意:数独,一种数学游戏。规则:空白处填入数字,使数独的每一行,每一列,每个宫格中没有重复数字。
思路:该题DFS暴搜就能过,数据比较水,真正厉害的数独题是3074(本人目前无力AC)。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <stack>
#define INF 0x3f3f3f3f
#define mod 1000000007
using namespace std;
struct node
{
int x,y;
}point[81];
int mp[11][11];
bool vis_h[10][10];
bool vis_l[10][10];
bool vis_m[10][10];
int k,flag;
void DFS(int cnt)
{
if(cnt==k)
{
flag=1;
return ;
}
int x=point[cnt].x;
int y=point[cnt].y;
for (int i=1;i<=9;i++)
{
if(!vis_h[x][i]&&!vis_l[y][i]&&!vis_m[(x-1)/3*3+(y-1)/3+1][i])
{
mp[x][y]=i;
vis_h[x][i]=1;
vis_l[y][i]=1;
vis_m[(x-1)/3*3+(y-1)/3+1][i]=1;
DFS(cnt+1);
if(flag) return ;
vis_h[x][i]=0;
vis_l[y][i]=0;
vis_m[(x-1)/3*3+(y-1)/3+1][i]=0;
}
}
}
int main()
{
int i,j;
int t;
char z[20];
scanf("%d%*c",&t);
while(t--)
{
memset(mp,0,sizeof(mp));
memset(vis_h,0,sizeof(vis_h));
memset(vis_l,0,sizeof(vis_l));
memset(vis_m,0,sizeof(vis_m));
k=0;flag=0;
for (i=1;i<=9;i++)
{
scanf("%s",z);
for (j=1;j<=9;j++)
{
mp[i][j]=z[j-1]-'0';
if(!mp[i][j])
{
point[k].x=i;
point[k++].y=j;
}
else
{
int x=mp[i][j];
vis_h[i][x]=1;
vis_l[j][x]=1;
vis_m[(i-1)/3*3+(j-1)/3+1][x]=1;
}
}
}
DFS(0);
for(i=1;i<=9;i++)
{
for (j=1;j<=9;j++)
{
printf("%d",mp[i][j]);
}
printf("\n");
}
}
return 0;
}