简单的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搜索却蕴含着小细节--生命游戏的主要内容,如果未能解决你的问题,请参考以下文章