HDU 1426数独キラー(DFS)
トピックリンク:http://acm.hdu.edu.cn/showproblem.php?pid=1426
問題解決のアイデア:メイングリッドを越えてまで、フレームのダウンによって、最初のフレームから始まるにより横断DFS(トピックを保証ので、ユニークなソリューション)、それぞれの出会いがありますか?値に沿ったもので、現在の状況かどうかを確認するために、記入してみてください上の1-9は、再帰的に、グリッドを超えて発見された、結果は(サンプル2つのグループは空白行を持っているかもしれません)入力にライン上の出力、注意を払うしていると言います
コードは次のとおりです。
#include<bits/stdc++.h>
using namespace std;
int sudoku[15][15];
inline bool check(int x,int y,int v){
for(int i=1;i<=9;i++){
if(sudoku[x][i]==v||sudoku[i][y]==v)return false;
}
int m,n;
if(x>=1&&x<=3){
if(y>=1&&y<=3){
m=1,n=1;
}else if(y>=4&&y<=6){
m=1,n=4;
}else{
m=1,n=7;
}
}else if(x>=4&&x<=6){
if(y>=1&&y<=3){
m=4,n=1;
}else if(y>=4&&y<=6){
m=4,n=4;
}else{
m=4,n=7;
}
}else{
if(y>=1&&y<=3){
m=7,n=1;
}else if(y>=4&&y<=6){
m=7,n=4;
}else{
m=7,n=7;
}
}
for(int i=m;i<=m+2;i++){
for(int j=n;j<=n+2;j++){
if(sudoku[i][j]==v)return false;
}
}
return true;
}
bool flag;
inline void dfs(int x,int y){
if(flag)return;
if(x==10){
flag=true;
for(int i=1;i<=9;i++){
for(int j=1;j<=9;j++){
if(j!=1)cout<<" ";
cout<<sudoku[i][j];
}
cout<<endl;
}
return;
}
if(y==10){
dfs(x+1,1);
return;
}
if(sudoku[x][y]!=0){
dfs(x,y+1);
return;
}
for(int i=1;i<=9;i++){
if(check(x,y,i)){
sudoku[x][y]=i;
dfs(x,y+1);
if(flag)return;
sudoku[x][y]=0;
}
}
}
int main(){
ios::sync_with_stdio(false);
int ans=0;
char c;
while(cin>>c){//用cin输入能避免很多麻烦的处理
for(int i=1;i<=9;i++){
for(int j=1;j<=9;j++){
if(i!=1||j!=1)cin>>c;
if(c=='?')sudoku[i][j]=0;
else sudoku[i][j]=c-'0';
}
}
if(ans!=0)cout<<endl;
ans++;
flag=false;
dfs(1,1);
}
return 0;
}