zoukankan      html  css  js  c++  java
  • 计蒜客 蓝桥模拟 F. 结果填空:数独

    代码:

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <iomanip>
    using namespace std;
    int n;
    int f[9][9];///记录每个位置的值  -1表示需要填
    int check(int x,int y,int k) {
        for(int i = 0;i < 9;i ++) {
            if(i != x && f[i][y] == k)return 0;
            if(i != y && f[x][i] == k)return 0;
        }
        int xx,yy;
        for(int i = 0;i < 3;i ++) {
            xx = x / 3 * 3 + i;
            for(int j = 0;j < 3;j ++) {
                yy = y / 3 * 3 + j;
                if(!(xx == x && yy == y) && f[xx][yy] == k)return 0;
            }
        }
        return 1;
    }
    void dfs(int x,int y) {//x代表行,y代表列,分别从0-8共9行(列)
        if(x == 9) {///x范围已过已经把表格填了一遍了  输出结果并返回
            for(int i = 0;i < 9;i ++) {
                for(int j = 0;j < 9;j ++) {
                    cout<<f[i][j]<<' ';
                }
                cout<<endl;
            }
            system("pause");
            return;
        }
        int xx = x,yy = y;
        f[x][y] = 1;///如果保持-1 下面循环不会进行 循环后会恢复为-1
        while(f[xx][yy] != -1) {
            if(xx >= 9)break;
            xx = xx + (yy + 1) / 9,yy = (yy + 1) % 9;///每循环一次yy+1,也就是从当前(x,y)的位置往右一行一行的遍历 找到下一个需要填的位置
        }
        f[x][y] = -1;
        for(int i = 1;i <= 9;i ++) {
            if(check(x,y,i)) {//当前填i可行的话 就dfs下一个需要填的位置(xx,yy)
                f[x][y] = i;
                dfs(xx,yy);
                f[x][y] = -1;//dfs终止表示这种策略不能dfs下去 位置值恢复为-1
            }
        }
    }
    int main() {
        memset(f,-1,sizeof(f));
        f[0][1] = 2;
        f[0][2] = 6;
        f[1][3] = 5;
        f[1][5] = 2;
        f[1][8] = 4;
        f[2][3] = 1;
        f[2][8] = 7;
        f[3][1] = 3;
        f[3][4] = 2;
        f[3][6] = 1;
        f[3][7] = 8;
        f[4][3] = 3;
        f[4][5] = 9;
        f[5][1] = 5;
        f[5][2] = 4;
        f[5][4] = 1;
        f[5][7] = 7;
        f[6][0] = 5;
        f[6][5] = 1;
        f[7][0] = 6;
        f[7][3] = 9;
        f[7][5] = 7;
        f[8][6] = 7;
        f[8][7] = 5;
        for(int i = 0;i < 9;i ++) {
            for(int j = 0;j < 9;j ++) {
                if(f[i][j] == -1)cout<<'*'<<' ';
                else cout<<f[i][j]<<' ';
            }
            cout<<endl;
        }
        getchar();
        dfs(0,0);
    }
  • 相关阅读:
    ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper]
    深入理解DIP、IoC、DI以及IoC容器(转)
    IoC模式(转)
    asp.net控件开发基础(1)(转)原文更多内容
    WPF/Silverlight HierarchicalDataTemplate 模版的使用(转)
    WPF的Presenter(ContentPresenter)(转)
    WPF/Silverlight Template使用及总结(转)
    .NET中异常处理的最佳实践(转)
    Objective-C专题,是学习iOS开发的前奏(转)
    浅析C#中的Attribute(转)
  • 原文地址:https://www.cnblogs.com/8023spz/p/8660034.html
Copyright © 2011-2022 走看看