题意:
解数独游戏。
分析:
这道数独的数独直接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