当前位置: 代码迷 >> 综合 >> poj 2918 Tudoku 数独dfs
  详细解决方案

poj 2918 Tudoku 数独dfs

热度:78   发布时间:2024-01-19 05:56:41.0

题意:

解数独游戏。

分析:

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


  相关解决方案