简单的dfs搜索却蕴含着小细节--生命游戏

Posted C_YCBX Py_YYDS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单的dfs搜索却蕴含着小细节--生命游戏相关的知识,希望对你有一定的参考价值。

题目

在这里插入图片描述

不注意小细节酿成大错!

本来看完题目想着开开心心直接dfs搜索AC即可,可是却半天调试不知错在哪(程序员最怕你写的代码不按照你想的答案出结果,否则半天调试不出来)…后面仔仔细细从头看到尾,发现一个小细节酿成大错。。。我竟然直接原地改了原数组的数据,所以导致后面count的更新结果都出错。。。

代码

class Solution {
private: //八个方向遍历更新
    const int dx[8] = {-1,1,0,0,-1,-1,1,1};
    const int dy[8] = {0,0,-1,1,-1,1,-1,1};
    int row,col;
    //用于计算某个细胞边上1的个数
    int countCell(vector<vector<int>>& board,int x,int y){
        int count = 0;
        for(int i=0;i<8;i++){
            int n_x = x+dx[i],n_y = y+dy[i];
            if(n_x>=0&&n_x<row&&n_y>=0&&n_y<col){
                if(board[n_x][n_y]==1)
                    count++;
            }

        }
        return count;
    }
public:
    void gameOfLife(vector<vector<int>>& board) {
        row = board.size();col = board[0].size();
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                int count = countCell(board,i,j);
                //憨了。。后面这几步结果发生改动导致无法正确更新count。。。
                if(board[i][j]==1){
                    if(count < 2||count>3)
                        board[i][j] = 0;
                }else{
                    if(count==3)board[i][j] = 1;
                }
            }
        }
    }
};

解决这个问题也很简单。。直接用临时数组存入答案就行。

正确代码

class Solution {
private: //八个方向遍历更新
    const int dx[8] = {-1,1,0,0,-1,-1,1,1};
    const int dy[8] = {0,0,-1,1,-1,1,-1,1};
    int row,col;
    //用于计算某个细胞边上1的个数
    int countCell(vector<vector<int>>& board,int x,int y){
        int count = 0;
        for(int i=0;i<8;i++){
            int n_x = x+dx[i],n_y = y+dy[i];
            if(n_x>=0&&n_x<row&&n_y>=0&&n_y<col){
                if(board[n_x][n_y]==1)
                    count++;
            }

        }
        return count;
    }
public:
    void gameOfLife(vector<vector<int>>& board) {
        row = board.size();col = board[0].size();
        vector<vector<int>>temp(row,vector<int>(col));
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                int count = countCell(board,i,j);
                //憨了。。后面这几步结果发生改动导致无法正确更新count。。。
                if(board[i][j]==1){
                    if(count < 2||count>3)
                        temp[i][j] = 0;
                    else temp[i][j] = 1;
                }else{
                    if(count==3)temp[i][j] = 1;
                }
            }
        }
        board = temp;
    }
};

霍霍,效率似乎还不错在这里插入图片描述

不用额外临时数组,原地操作

原地操作怎么实现呢?这是根据这道生命游戏的特点来的,由于生命游戏只存在0和1,那么我们可以人为再制造两个状态来表示它变化之前的状态,比如用2表示0变成1后的状态,在它被用于计算又多少个1时被当作0处理,而最后的修正环节它就被当作1处理,同理1变为0也是类似的操作。

内存消耗似乎没有任何区别。。可能是数据量较少的原因。在这里插入图片描述

class Solution {
private: //八个方向遍历更新
    const int dx[8] = {-1,1,0,0,-1,-1,1,1};
    const int dy[8] = {0,0,-1,1,-1,1,-1,1};
    int row,col;
    //用于计算某个细胞边上1的个数
    int countCell(vector<vector<int>>& board,int x,int y){
        int count = 0;
        for(int i=0;i<8;i++){
            int n_x = x+dx[i],n_y = y+dy[i];
            if(n_x>=0&&n_x<row&&n_y>=0&&n_y<col){
                //包括曾经是1的board
                if(board[n_x][n_y]==1||board[n_x][n_y]==3)
                    count++;
            }

        }
        return count;
    }
public:
    void gameOfLife(vector<vector<int>>& board) {
        row = board.size();col = board[0].size();
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                int count = countCell(board,i,j);
                //更新board为3或者2状态,这种情况就需要修改count函数了,由于要计算的是之前的1的个数
                if(board[i][j]==1){
                    if(count < 2||count>3)
                        board[i][j] = 3;
                }else{
                    if(count==3)board[i][j] = 2;
                }
            }
        }
        //再次修正
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                if(board[i][j]==2){
                    board[i][j] = 1;
                }if(board[i][j]==3)board[i][j] = 0;
            }
        }
    }
};

以上是关于简单的dfs搜索却蕴含着小细节--生命游戏的主要内容,如果未能解决你的问题,请参考以下文章

DFS数独游戏

博弈知识纲要

记忆化搜索(DFS)--How many ways

博弈总结

使用深度优先搜索DFS求解star battle游戏

题解 SP1841 PPATH - Prime Path