您的位置:首页 > 其它

poj 2676 Sudoku

2017-10-26 16:19 337 查看
题意:完成9*9的数独。

思路:直接DFS即可,判断该数是否在该行、该列、该九格中出现过。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <string>
#include <math.h>
#include <map>
using namespace std;
int d[10][10];//存储整个矩阵
int p[100][2];//存储需要填的点
int k;//需要填的点的个数
bool x[10][10],y[10][10],z[10][10];//标记数组
bool dfs(int v)
{
if(v==k) return true;
for(int i=1;i<10;i++)
{
if(!x[p[v][0]][i] && !y[p[v][1]][i] && !z[p[v][0]/3*3+p[v][1]/3][i])
{
d[p[v][0]][p[v][1]]=i;
x[p[v][0]][i] = true;
y[p[v][1]][i] = true;
z[p[v][0]/3*3+p[v][1]/3][i]=true;
if(dfs(v+1)) return true;
d[p[v][0]][p[v][1]]=0;
x[p[v][0]][i] = false;
y[p[v][1]][i] = false;
z[p[v][0]/3*3+p[v][1]/3][i]=false;
}
}
return false;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
char s[10];
memset(d,0,sizeof(d));
memset(p,0,sizeof(p));
memset(x,0,sizeof(x));
memset(y,0,sizeof(y));
memset(z,0,sizeof(z));
k=0;
for(int i=0;i<9;i++)
{
scanf(" %s",s);
for(int j=0;j<9;j++)
{
d[i][j]=s[j]-'0';
if(d[i][j]==0)
{
p[k][0]=i;
p[k++][1]=j;
}
else
{
x[i][d[i][j]]=true;
y[j][d[i][j]]=true;
z[i/3*3+j/3][d[i][j]]=true;
}
}
}
dfs(0);
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
printf("%d",d[i][j]);
}
printf("\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: