您的位置:首页 > 其它

POJ-dfs-2676-Sudoku

2016-10-24 12:49 405 查看
题意:

数独游戏。

思路:

在每次分割区域后,查询是否满足要求。

#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
int row[15][15];
int col[15][15];
int some[15][15];
char save[15][15];
int mp[15][15];
int over;
void Prin()
{
for(int i=1;i<=9;i++)
{
for(int j=1; j<=9; j++)
printf("%d",mp[i][j] );
printf("\n");
}
}
void dfs(int x,int y)
{
if(x==10)
{
Prin();
over=1;
return ;
}
if(over)
return ;
if(mp[x][y])
{
if(y==9)
dfs(x+1,1);
else
dfs(x,y+1);
}
else
{
int op=3*((x-1)/3)+(y-1)/3+1;
for(int i=1;i<=9;i++)
{
if(row[x][i]!=0||col[y][i]!=0||some[op][i]!=0)
continue;
mp[x][y]=i;
row[x][i]=1;
col[y][i]=1;
some[op][i]=1;
if(y==9)
dfs(x+1,1);
else
dfs(x,y+1);
mp[x][y]=0;
row[x][i]=0;
col[y][i]=0;
some[op][i]=0;
}
}
}
int main()
{
int T;
cin>>T;
while(T--)
{
memset(row,0,sizeof(row));
memset(col,0,sizeof(col));
memset(some,0,sizeof(some));
over=0;
for(int i=1;i<=9;i++)
for(int j=1;j<=9;j++)
{
cin>>save[i][j];
mp[i][j]=save[i][j]-'0';
if(mp[i][j])
{
int op=3*((i-1)/3)+(j-1)/3+1;
row[i][mp[i][j]]=1;
col[j][mp[i][j]]=1;
some[op][mp[i][j]]=1;
}
}
dfs(1,1);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: