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

推荐订阅源

Stack Overflow Blog
Stack Overflow Blog
Y
Y Combinator Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
M
MIT News - Artificial intelligence
GbyAI
GbyAI
A
About on SuperTechFans
T
The Blog of Author Tim Ferriss
雷峰网
雷峰网
Blog — PlanetScale
Blog — PlanetScale
J
Java Code Geeks
IT之家
IT之家
Microsoft Azure Blog
Microsoft Azure Blog
V
V2EX
爱范儿
爱范儿
N
Netflix TechBlog - Medium
U
Unit 42
博客园 - 三生石上(FineUI控件)
WordPress大学
WordPress大学
博客园 - 叶小钗
G
Google Developers Blog
Jina AI
Jina AI
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
The GitHub Blog
The GitHub Blog
腾讯CDC

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

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;
    }