• POJ2676 Sudoku


    题意:数独

    题解:dfs.dfs前判断能否填。

      判断方法:用三个数组。

    #define _CRT_SECURE_NO_WARNINGS
    #include<cstring>
    #include<cctype>
    #include<cstdlib>
    #include<cmath>
    #include<cstdio>
    #include<string>
    #include<stack>
    #include<ctime>
    #include<list>
    #include<set>
    #include<map>
    #include<queue>
    #include<vector>
    #include<sstream>
    #include<iostream>
    #include<functional>
    #include<algorithm>
    #include<memory.h>
    //#define INF 0x3f3f3f3f
    #define eps 1e-6
    #define pi acos(-1.0)
    #define e exp(1.0)
    #define rep(i,t,n)  for(int i =(t);i<=(n);++i)
    #define per(i,n,t)  for(int i =(n);i>=(t);--i)
    #define mp make_pair
    #define pb push_back
    #define mmm(a,b) memset(a,b,sizeof(a))
    //std::ios::sync_with_stdio(false);
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    void smain();
    #define ONLINE_JUDGE
    int main() {
    //    ios::sync_with_stdio(false);
    #ifndef ONLINE_JUDGE
        freopen("in.txt", "r", stdin);
        freopen("out.txt", "w", stdout);
        long _begin_time = clock();
    #endif
        smain();
    #ifndef ONLINE_JUDGE
        long _end_time = clock();
        printf("time = %ld ms.", _end_time - _begin_time);
    #endif
        return 0;
    }
    int  rowflag[9][10], colflag[9][10], blockflag[9][10];
    int board[9][9];
    struct pos {
        int r, c;
        pos(int rr, int cc) :r(rr), c(cc) {}
    };
    vector<pos> blankpos;
    inline int GetBlockNum(int r, int c) {
        int rr = r / 3;
        int cc = c / 3;
        return rr * 3 + cc;
    }
    void SetAllFlags(int r, int c, int num, int f) {
        rowflag[r][num] = f;
        colflag[c][num] = f;
        blockflag[GetBlockNum(r, c)][num] = f;
    }
    bool isOK(int r, int c, int num) {
        return !rowflag[r][num] && !colflag[c][num] && !blockflag[GetBlockNum(r, c)][num];
    
    }
    bool  dfs(int n) {//处理前n个
        if (n < 0) return 1;
        int r = blankpos[n].r;
        int c = blankpos[n].c;
        rep(num, 1, 9) {
            if (isOK(r, c, num)) {
                board[r][c] = num;
                SetAllFlags(r, c, num, 1);
                if (dfs(n - 1)) return 1;
                SetAllFlags(r, c, num, 0);
            }
        }
        return 0;
    }
    void Run() {
        mmm(rowflag, 0);
        mmm(colflag, 0);
        mmm(blockflag, 0);
        blankpos.clear();
        rep(i, 0, 8)rep(j, 0, 8) {
            char c;
            cin >> c;
            board[i][j] = c - '0';
            if (board[i][j])SetAllFlags(i, j, board[i][j], 1);
            else blankpos.push_back(pos(i, j));
    }
        
        if (dfs(blankpos.size()-1 ) ){
            rep(i, 0, 8) {
                rep(j, 0, 8) cout <<char( board[i][j]+'0');
                cout << endl;
            }
            
        }
    }
    
    void smain() {
        int t;
        cin >> t;
        while (t--) {
            Run();
        }
    }
    成功的路并不拥挤,因为大部分人都在颓(笑)
  • 相关阅读:
    kali的一些基本操作
    Linux下find和rm的组合使用--整理转载
    虚拟接口模板- virtual-template
    点到点(point-to-point) 与 端到端(end to end)
    Ruby学习笔记-第二章
    Ruby学习笔记-第一章
    每天一个Linux命令-find
    每天一个Linux命令-du df
    每天一个Linux命令-more less
    每天一个Linux命令-cat
  • 原文地址:https://www.cnblogs.com/SuuT/p/8982030.html
Copyright © 2020-2023  润新知