zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    Windows 10 开发日记(二)-- 手势顺序调研
    Windows 10 开发日记(一) -- 手势通览
    开篇说两句
    我从上海回苏州了,你懂的!
    数组名相关
    指针相关笔记
    static相关
    输入分式,输出化简式的C语言算法
    语句界定
    switch相关
  • 原文地址:https://www.cnblogs.com/zhangjialu2015/p/5709833.html
Copyright © 2011-2022 走看看