Hdu 1426 Sudoku Killer

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;
}
发布了35 篇原创文章 · 获赞 3 · 访问量 886

猜你喜欢

转载自blog.csdn.net/weixin_43823753/article/details/104638331