HDU 5547 简单数独 dfs

本文介绍了一个复杂的判断函数实现,该函数用于验证特定位置上的数字放置是否满足行、列及2x2子区域内的唯一性条件。通过递归深度优先搜索算法(DFS),实现了对所有可能的数字放置方案进行遍历和验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

判断函数写的稍微有些复杂,可以参考其他的判断函数
#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值