题意:
解数独游戏。
分析:
这道数独的数独直接dfs就能过。
代码:
//poj 2918
//sep9
#include<iostream>
using namespace std;
char s[12][12];
int board[12][12];
int CheckSquare[12][12];
int CheckRow[12][12];
int CheckColumn[12][12];
int ok;
int GetSquareId(int i,int j)
{
int r=i/3;
int c=j/3;
return r*3+c;
}
int check()
{
int i,j;
for(i=0;i<9;++i)
for(j=0;j<9;++j)
{
if(CheckRow[i][j]==0||CheckColumn[i][j]==0||CheckSquare[i][j]==0)
return 0;
}
ok=1;
return 1;
}
void dfs(int i,int j)
{
if(ok==1)
return;
if(board[i][j]!=0)
{
if(j<8)
dfs(i,j+1);
else
{
if(i<8)
dfs(i+1,0);
else
check();
}
}
else
{
int x,ids=GetSquareId(i,j);
for(x=1;x<=9;++x)
{
if(CheckRow[i][x]==0&&CheckColumn[j][x]==0&&CheckSquare[ids][x]==0)
{
board[i][j]=x;
CheckRow[i][x]=1;
CheckColumn[j][x]=1;
CheckSquare[ids][x]=1;
if(j<8)
dfs(i,j+1);
else
{
if(i<8)
dfs(i+1,0);
else
check();
}
if(ok==1)
return ;
CheckRow[i][x]=0;
CheckColumn[j][x]=0;
CheckSquare[ids][x]=0;
}
}
board[i][j]=0;
}
}
int main()
{
int cs,t=0;
scanf("%d",&cs);
while(cs--)
{
int i,j;
memset(CheckColumn,0,sizeof(CheckColumn));
memset(CheckRow,0,sizeof(CheckRow));
memset(CheckSquare,0,sizeof(CheckSquare));
for(i=0;i<9;++i)
scanf("%s",s[i]);
for(i=0;i<9;++i)
for(j=0;j<9;++j)
{
board[i][j]=s[i][j]-'0';
int x=board[i][j];
CheckRow[i][x]=1;
CheckColumn[j][x]=1;
int ids=GetSquareId(i,j);
CheckSquare[ids][x]=1;
}
ok=0;
dfs(0,0);
printf("Scenario #%d:\n",++t);
for(i=0;i<9;++i)
{
for(j=0;j<9;++j)
printf("%d",board[i][j]);
printf("\n");
}
printf("\n");
}
return 0;
}原文地址:http://blog.csdn.net/sepnine/article/details/44159575