• hud 5547 sodoku (DFS)


    题目连接

    题目大意:4*4的网格做数独,*代表空的格子,要求将4*4分解为4个2*2的网格,每个2*2网格也满足数独(包含1234)

    code:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    int cnt[4];
    bool vis[4][5];
    char m[4][4];
    bool dfs(int x,int y){
        int nx,ny;
        nx = x/2;
        ny = y/2;
        if(x > 3){
            return true;
        }
        if(m[x][y] != '*'){
            if((x == 1 && y == 1) || (x == 1 && y == 3) ||(x == 3 && y == 1)||(x == 3 && y == 3)){
                    if(m[0+2*nx][0+2*ny] + m[1+2*nx][1+2*ny] + m[1+2*nx][0+2*ny] + m[0+2*nx][1+2*ny] != 10 + 4 * '0' ){
                        return false;
                    }
                    else{
                        if(m[0+2*nx][0+2*ny] == m[1+2*nx][1+2*ny] || m[1+2*nx][0+2*ny] == m[0+2*nx][1+2*ny]) return false;
                    }
            }
            if(y + 1 < 4) return dfs(x,y+1);
            else  return dfs(x+1,0);
        }
        else if(m[x][y] == '*'){
            for(int i = 1;i <= 4;i ++){
                int flag = 1;
                m[x][y] = i + '0';
                for(int j = 0;j < 4;j ++){
                    if(j == y) continue;
                    if(m[x][j] - '0' == i) {flag = 0;break;}
                }
                for(int j = 0;j < 4;j ++){
                    if(x == j) continue;
                    if(m[j][y] - '0' == i) {flag = 0;break;}
                }
                if((x == 1 && y == 1) || (x == 1 && y == 3) ||(x == 3 && y == 1)||(x == 3 && y == 3)){
                    if(m[0+2*nx][0+2*ny] + m[1+2*nx][1+2*ny] + m[1+2*nx][0+2*ny] + m[0+2*nx][1+2*ny] != 10 + 4 * '0'){
                        flag = 0;
                    }
                    else{
                        if(m[0+2*nx][0+2*ny] == m[1+2*nx][1+2*ny] || m[1+2*nx][0+2*ny] == m[0+2*nx][1+2*ny])  flag = 0;
                    }
                }
                if(flag){
                    m[x][y] = i + '0';
                    if(y + 1 < 4) {
                        if(dfs(x,y+1)) return true;
                    }
                    else {
                        if(dfs(x+1,0)) return true;
                    }
                }
                m[x][y] = '*';
            }
            return false;
        }
    }
    int main()
    {
        int cas;
        cin >> cas;
        getchar();
        int cnt = 1;
        while(cas --){
            for(int i = 0;i < 4;i ++){
                for(int j = 0;j < 4;j ++){
                    cin >> m[i][j];
                }
                getchar();
            }
            dfs(0,0);
            printf("Case #%d:
    ",cnt++);
            for(int i = 0;i < 4;i ++){
                for(int j = 0;j < 4;j ++){
                    cout << m[i][j];
                }
                cout << endl;
            }
        }
        return 0;
    }
  • 相关阅读:
    决策树算法
    数据挖掘建模-Logistic回归
    Python数据结构与算法-栈和递归函数
    使用python自动化生成软件著作权的源代码
    一起玩转图论算法(1)图的基本表示
    全网最最最详细的软件著作权申请步骤
    时间序列模式(ARIMA)---Python实现
    宝塔面板怎样部署SSL证书?
    Linux基础概念入门
    转载:VMware workstation创建虚拟机,安装Ubuntu系统
  • 原文地址:https://www.cnblogs.com/zhangjialu2015/p/5709833.html
Copyright © 2020-2023  润新知