• leetcode第一刷_Sudoku Solver


    这道题简直是耻辱啊。竟然被吓得不敢做,最终開始写还犯下了各种低级错误,花了好久的时间。

    事实上假设想明确81*9事实上是非常小的规模的话,早就想到用回溯法了,这不是跟八皇后全然一样的嘛。每次填入的时候,验证一下合不合理,当中合不合理在上一个问题中已经讨论过了。对当前位置讨论更简单。

    所的头头是道。你会问“那你是错在哪呢?”你猜啊。我在推断一个小方格时候合理时,走了非常多弯路。一開始想的是用循环和减法。找到当前位置所在的小方格最左上角的位置。事实上全然不用啊亲。当听到实验室的同学说3*(i/3)和3*(j/3)直接就是时。我眼泪都掉下来了。蠢爆了。还有。在推断board上的字符等不等于当前字符p时,我竟然写出了board[i][j]=='p'这样的惊天地泣鬼神的代码,给自己跪了。p传进去的就是字符格式了,在数独的棋盘上到哪找等于‘p’的位置啊。

    class Solution {
    public:
        int MAX = 9;
        bool flag = false;
        bool isValide(vector<vector<char> > &board, char p, int i, int j){
            for(int k=0;k<MAX;k++){
                if(board[i][k] == '.')  continue;
                if(k!=j&&board[i][k] == p)
                    return false;
            }
            for(int k=0;k<MAX;k++){
                if(board[k][j] == '.')  continue;
                if(k!=i&&board[k][j] == p)
                    return false;
            }
            int refi = 3*(i/3), refj = 3*(j/3);
            for(int m=refi;m<refi+3;m++){
                for(int n=refj;n<refj+3;n++){
                    if(m==i && n==j)  continue;
                    if(board[m][n] == '.') continue;
                    if(board[m][n] == p)
                        return false;
                }
            }
            return true;
        }
        
        void fileSudo(vector<vector<char> > &board, int pos){
            if(pos == 81)   {flag = true; return;}
            int i=pos/MAX, j=pos%MAX;
            if(isdigit(board[i][j])){  
                fileSudo(board, pos+1);
            }else{
                for(char p='1';p<='9';p++){
                	//cout<<i<<" "<<j<<" "<<p<<endl;
                    if(isValide(board, p, i, j)){
                        board[i][j] = p;
                        //cout<<"nice p:"<<p<<endl;
                        fileSudo(board, pos+1);
                        if(flag) return;
                    }
                }
                board[i][j] = '.';
            }
        }
        void solveSudoku(vector<vector<char> > &board) {
            fileSudo(board, 0);
        }
    };



  • 相关阅读:
    Windows Mobile 开发资源 [转]
    CIO与CTO的区别
    [转]快速产品开发的12项指南
    VS Template Parameters
    MSDN Webcast 使用Windows Mobile Test Framework进行自动化测试(Level 300)
    10年内两类必被淘汰的企业软件开发公司(转载)
    小学期第二周收获
    对于学长创作的软件 TD信息通(无课表)的使用体验以及改进内容
    小学期第一周收获
    Delphi中建议使用的语句
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/8290020.html
Copyright © 2020-2023  润新知