| Time Limit: 2000MS | Memory Limit: 65536K | |||
| Total Submissions: 15456 | Accepted: 7574 | Special Judge | ||
Description

Input
Output
Sample Input
1 103000509 002109400 000704000 300502006 060000050 700803004 000401000 009205800 804000107
Sample Output
143628579 572139468 986754231 391542786 468917352 725863914 237481695 619275843 854396127
Source
题目链接:http://poj.org/problem?id=2676
题目大意:数独游戏。用9个数字填满一个有9*9个格子的棋盘,有的格子里已经填有数字,有的格子是空白格子,标记为0,要求在空白格子中填入数字,保证每行每列每个小九宫格里1-9个数字都出现。
解题思路:枚举9个数字,DFS搜索满足填入数字的情况,经典搜索题。
代码如下:
#include <cstdio>
#include <cstring>
int a[10][10];
char s[10][10];
bool p;
bool ok(int k,int x,int y) //判断数字k是否满足条件
{
for(int i=0;i<9;i++) //保证每行不出现重复数字
if(a[x][i]==k)
return false; //保证每列不出现重复数字
for(int i=0;i<9;i++)
if(a[i][y]==k)
return false;
x=x-x%3,y=y-y%3;
for(int i=x;i<x+3;i++) //保证每个小九宫格里不出现重复数字
for(int j=y;j<y+3;j++)
{
if(a[i][j]==k)
return false;
}
return true;
}
void dfs(int x,int y) //x,y是当前格子的横纵坐标
{
if(p||x==9) //x为9时说明格子已填满,p标记搜索成功,返回
{
p=true;
return;
}
while(a[x][y]) //当格子里有数字时改变坐标直道得到空格子
{
if(y==8)
{
x++;
y=0;
}
else
y++;
if(x==9)
{
p=true;
return;
}
}
for(int k=1;k<=9;k++) //枚举九个数字,判断这些数字是否能填入当前格子
{
if(ok(k,x,y))
{
a[x][y]=k;
if(y==8)
dfs(x+1,0);
else
dfs(x,y+1);
if(p)
return;
a[x][y]=0;
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
p=false;
for(int i=0;i<9;i++)
{
scanf("%s",s[i]);
for(int j=0;j<9;j++)
a[i][j]=s[i][j]-'0';
}
dfs(0,0);
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
printf("%d",a[i][j]);
printf("\n");
}
}
return 0;
}版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/criminalcode/article/details/46832457