标签:icp png 参考 load its har 空白 images amp
数独是非常流行的益智游戏,把一个9x9的九宫格分成9个小的3x3的小九宫,如下图所示。在这个九宫格上,每个小格子可以填的数字为1,2,3,...,9。初始时,某些格子已经填好数字,剩余的一些则为空白,你的任务是把空白的数字都填上1,2,3,...,9数字的一个,使得表格上每一行、每一列、以及每一个小九宫均含有有1,2,3,...,9(显然每个数字在每行、每列和每个小九宫中都出现并且只能出现一次)。请你写一个程序解决数独问题。
输入为9行,每行9个数字,其中0代表对应的小格子为空白的格子。
输出为9行,每行9个有1,2,3,...,9构成的数字。即数独问题的解。
103000509 002109400 000704000 300502006 060000050 700803004 000401000 009205800 804000107
143628579 572139468 986754231 391542786 468917352 725863914 237481695 619275843 854396127
说一下思路吧,我是参考黄学长的~就是将每一行每一列每一个九宫格标记一下,然后dfs搜索,注意边界和搜索完要保持原先的状态即可~
#include<bits/stdc++.h>
#define Next(x,y) y==9 ? dfs(x+1,1) : dfs(x,y+1)
using namespace std;
int a[10][10],b[10][10];
bool l[10][10],r[10][10],s[10][10];
int Map[10][10];
int fill(int x,int y,int k)
{
if(l[x][k]||r[y][k]||s[Map[x][y]][k]) return 0;
b[x][y]=k;
l[x][k]=r[y][k]=s[Map[x][y]][k]=1;
return 1;
}
void del(int x,int y,int k)
{
b[x][y]=0;
l[x][k]=r[y][k]=s[Map[x][y]][k]=0;
}
void print()
{
for(int i=1;i<=9;i++){
for(int j=1;j<=9;j++)
cout<<b[i][j]<<"";
cout<<"\n";}
}
void dfs(int x,int y)
{
if(x==10&&y==1)
{
print();exit(0);
}
if(b[x][y]) Next(x,y);
else
{
for(int i=1;i<=9;i++)
{
if(fill(x,y,i))
{
Next(x,y);
del(x,y,i);//搜过之后要删除
}
}
}
}
void init()
{
for(int i=1;i<=9;i++)
for(int j=1;j<=9;j++)
Map[i][j]=(i-1)/3*3+(j-1)/3+1;
}
int main()
{
char str;
init();
/*for(int i=1;i<=9;i++){
for(int j=1;j<=9;j++)
cout<<Map[i][j]<<" ";
cout<<"\n";}*/
for(int i=1;i<=9;i++)
{
for(int j=1;j<=9;j++)
{
str=getchar();
a[i][j]=str-‘0‘;
if(a[i][j])
fill(i,j,a[i][j]);
}
getchar();
}
dfs(1,1);
/*for(int i=1;i<=9;i++){
for(int j=1;j<=9;j++)
cout<<s[i][j]<<" ";
cout<<"\n";}*/
}
标签:icp png 参考 load its har 空白 images amp
原文地址:http://www.cnblogs.com/foreverpiano/p/6939920.html