Hdu 1426 Sudoku Killer

Hdu 1426 Sudoku Killer (DFS)

enlaces a los temas: http://acm.hdu.edu.cn/showproblem.php?pid=1426
Aquí Insertar imagen Descripción
Aquí Insertar imagen Descripción
Aquí Insertar imagen Descripción
las ideas de resolución de problemas: DFS atravesados por empezando por el primer fotograma a fotograma hacia abajo hasta más allá de la red principal (porque la garantía temas tiene una solución única), cada encuentro? 1-9 en tratar de llenar en, para ver si la situación actual, en línea con el valor, de forma recursiva, más allá dice que ha encontrado la red, los resultados se emiten en la línea, prestar atención a la entrada (muestra dos grupos podrían tener líneas en blanco)
código es el siguiente:

#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;
}
Publicado 35 artículos originales · ganado elogios 3 · Vistas 886

Supongo que te gusta

Origin blog.csdn.net/weixin_43823753/article/details/104638331
Recomendado
Clasificación