Hdu 1426 Sudoku Killer(dfs)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1426
解题思路:用dfs从第一个开始一格一格往下遍历,直到超出格子为主(因为题目保证一定存在唯一解),每次遇到?就尝试把1到9填进去,看是否符合当前情况,符合该值,继续递归,到超出格子就表示已经找到了,把结果输出就行了,注意输入(两组样例中可能有空行)
代码如下:
#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;
}