HDU 5547 简单数独 dfs

判断函数写的稍微有些复杂,可以参考其他的判断函数
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

bool flag;
char graph[5][5];
int a[4][4] = {{0,1,4,5},{2,3,6,7},{8,9,12,13},{10,11,14,15}};

bool judge(int idx){  //判断idx位的数字放置方式是否满足条件
    int row = idx/4 , col = idx%4;
    char ch = graph[row][col];
    //同一行
    for(int j=0;j<4;j++){
        if(j!=col && graph[row][j]==ch){
            return false;
        }
    }
    //同一列
    for(int i=0;i<4;i++){
        if(i!=row && graph[i][col]==ch){
            return false;
        }
    }
    //同一个2*2格子
    if(idx==0 || idx==1 || idx==4 || idx==5){
        for(int i=0;i<4;i++){
            int t = a[0][i];
            if(t!=idx && graph[t/4][t%4]==graph[row][col]){
                return false;
            }
        }
    }
    else if(idx==2 || idx==3 || idx==6 || idx==7){
        for(int i=0;i<4;i++){
            int t = a[1][i];
            if(t!=idx && graph[t/4][t%4]==graph[row][col]){
                return false;
            }
        }
    }
    else if(idx==8 || idx==9 || idx==12 || idx==13){
        for(int i=0;i<4;i++){
            int t = a[2][i];
            if(t!=idx && graph[t/4][t%4]==graph[row][col]){
                return false;
            }
        }
    }
    else if(idx==10 || idx==11 || idx==14 || idx==15){
        for(int i=0;i<4;i++){
            int t = a[3][i];
            if(t!=idx && graph[t/4][t%4]==graph[row][col]){
                return false;
            }
        }
    }
    return true;
}

void dfs(int idx){
    if(idx==16){
        flag = true;
        for(int i=0;i<4;i++)
            printf("%s\n",graph[i]);
        return ; //达到目标状态
    }
    if(flag) return;
    int row = idx/4 , col = idx%4;
    if(graph[idx/4][idx%4]=='*'){  //只有当前位置为*才需要放置数字
        for(int i=1;i<=4;i++){   //在当前位置考虑4种数字的放置方法
            graph[row][col] = i+'0';
            if(judge(idx)){
                dfs(idx+1);
            }
            graph[row][col] = '*';
        }
    }
    else{
        dfs(idx+1);
    }
}

int main(){
    int t;
    int cnt = 1;
    scanf("%d",&t);
    while(t--){
        flag = false;
        for(int i=0;i<4;i++){
            scanf("%s",graph[i]);
        }
        printf("Case #%d:\n",cnt++);
        dfs(0);
//        for(int i=0;i<4;i++)
//            printf("%s\n",graph[i]);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42246923/article/details/80759873