您的位置:首页 > 其它

POJ_2676_Sudoku

2015-07-23 18:36 405 查看
数独,当年一家人都很疯狂的玩

如今用电脑dfs非常容易的就解决了。

判断在同一大格里可以填有点麻烦。

题目每组输入其实是9个整数,所以……

另外就是题目要求对于有多个解的题目,输出一个可行解。
#include <iostream>
#include <stdio.h>
using namespace std;

int ss[9];                       //输入这里也卡了一下
int s[9][9];

int f;

bool cilr(int x,int y,int n)             //判断是不是在同一行同一列
{
for(int i=0;i<9;i++)
if(n==s[x][i]||n==s[i][y])
return 0;
return 1;
}

bool cibox(int x,int y,int n)            //判断是不是在同一个小格子里
{
int px,py;
if(x<3)  px=0;
else if(x>5)  px=6;
else     px=3;
if(y<3)  py=0;
else if(y>5)  py=6;
else     py=3;
for(int i=px;i<px+3;i++)
for(int j=py;j<py+3;j++)
if(s[i][j]==n)
return 0;
return 1;
}

void shows()                          //打印数独
{
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
printf("%d",s[i][j]);
printf("\n");
}
}

void clear()                        //清空数独
{
for(int i=0;i<9;i++)
for(int j=0;j<9;j++)
s[i][j]=0;
}

void dfs(int x,int y)
{
if(f)                            //这个标记用来确定答案是否出现了
return;
if(x==9)                         //数独填完了
{
shows();
f=1;
return;
}
if(s[x][y])                      //已经填了x,y那么下个格子
{
if(y<8)
dfs(x,y+1);
else
dfs(x+1,0);
}
else
{
for(int i=1;i<=9;i++)
{
if(cilr(x,y,i)&&cibox(x,y,i))
{
s[x][y]=i;
//cout<<i;
dfs(x,y);
//cout<<"re"<<endl;              //第一次总是在中间停住
}
}
s[x][y]=0;                               //这个语句很关键,最开始想的是从左向右从上到下填不会需要
}                                            //但回退后如果后面的节点回退时没有清空会影响回退后的判断
}

int main()
{
int t;
scanf("%d",&t);
while(t--)
{
f=0;
for(int i=0;i<9;i++)
scanf("%d",&ss[i]);         //注意如果用读整数的方法只能读进来9个整数
for(int i=0;i<9;i++)
for(int j=8;j>=0;j--)       //转化为9*9格里面的数
{
s[i][j]=ss[i]%10;
ss[i]/=10;
}
dfs(0,0);
clear();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: