poj 2918 Tudoku 数独dfs

来源:互联网 发布:plc编程多久能入门 编辑:程序博客网 时间:2024/06/15 18:35

题意:

解数独游戏。

分析:

这道数独的数独直接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);elsecheck();}}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);elsecheck();}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;}


0 0
原创粉丝点击