惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
Visual Studio Blog
罗磊的独立博客
宝玉的分享
宝玉的分享
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
V
V2EX
酷 壳 – CoolShell
酷 壳 – CoolShell
T
Tailwind CSS Blog
博客园_首页
量子位
月光博客
月光博客
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 司徒正美
人人都是产品经理
人人都是产品经理
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
爱范儿
爱范儿
S
SegmentFault 最新的问题
雷峰网
雷峰网
小众软件
小众软件
博客园 - 聂微东
美团技术团队
Apple Machine Learning Research
Apple Machine Learning Research
WordPress大学
WordPress大学
Jina AI
Jina AI
Hugging Face - Blog
Hugging Face - Blog

博客园 - 来自海边的一片云

Binary Tree Maximum Path Sum 解题注意 CodingTMD’s Reading List De Bruijn 序列生成 Word Ladder I ,II 解题思路 leetcode Word Break II 解题思路 Search for a string in an infinite stream of input string. 内存管理 Permutations leetcode Clone Graph leetcode 开弓没有回头箭 combination sum leetcode Combinations leetcode 组合问题 word break leetcode LRU cache Leetcode 重新试着写blog SQL injection Fuzz testing XML库的解析效率 Init()
suduko及8皇后问题及相关问题的解题思路
来自海边的一片云 · 2014-02-16 · via 博客园 - 来自海边的一片云

1.经典的N皇后问题

就是个经典的DFS算法

我摆到第一行第一列了哦,然后就开始Deep看下一行,可以放哪,然后递推,直到棋盘的行列到。

  void NQueenHelper(vector<vector<string>> & board, vector<vector<string>>& result, int row)
    {
        int N = board.size();
        if (row == N)//reached end scenario
        {
            string str;
            vector<string> final;
            for (int i = 0; i<N; i++)
            {
                for (int j = 0; j<N; j++)
                {
                    str.push_back(board[i][j][0]);
                }
    
                final.push_back(str);
                str.clear();
            }
            result.push_back(final);
        }
    
        for (int col = 0; col < N; col++)
        {
            if (isValidMove(board, row, col))
            {
                board[row][col] = "Q";
                NQueenHelper(board, result, row + 1);
                board[row][col] = ".";
            }
        }
    }

其中判断suduko的解法中,稍微不同的一点在于

isValidMove
八皇后问题
    bool isValidBoard(vector<vector<int>>& board, int col, int row)
    {
        int size = board.size();
        //look at col 
        for(int i =0; i<col ; i++)
        if(board[row][i]) return false;
        
        //look at row
        for(int i = 0;i <row; i++ )
        if(board[i][col]) return false;
        
        //diag
        for(int i= row, j= col; i>=0&&j>=0; i--,j--)
        {
            if(board[i][j]) return false;
        }
        
        for(int i= row, j= col; i>=0&& j<size; i--,j++)
        {
            if(board[i][j]) return false;
        }
        
        return true;
        
    }

而sudoku

判断合法的是

    // 检查往某个位置填入一个数之后整个 board 是否有效(只需要考虑当前行、
    // 当前列和所属的田字格)
    bool isValidBoard(const vector< vector<char> >& board, pair<int, int> pos) {
        // 检查当前行是否有效
        if (!isValid(board[pos.first])) return false;

        // 检查当前列是否有效
        vector<char> column(9);
        for (int i = 0; i < 9; ++i)
            column[i] = board[i][pos.second];
        if (!isValid(column)) return false;

        // 检查所在的田字格是否有效
        int block_row = pos.first / 3;
        int block_col = pos.second / 3;
        vector<char> block;
        for (int i = block_row * 3; i < block_row * 3 + 3; ++i)
            for (int j = block_col * 3; j < block_col * 3 + 3; ++j)
                block.push_back(board[i][j]);
        if (!isValid(block)) return false;

        // 如果以上都有效,则返回 true
        return true;
    }