c++ - 如何检查字符串 vector 中字符的所有邻居

标签 c++ vector c++17

康威的游戏。尝试访问我从文件中读取的每个“单元”的所有邻居。
如果一个单元还活着,那么如果它恰好有两个或三个邻居,它会为下一代保持生命。
如果一个单元已死,那么如果它恰好具有三个邻居,那么它会为下一代存活。
在这两种情况下,E都有8个邻居。
我对下一代的收入有疑问:

.........                 F......DE
...ABC...                 I......GH
...DEF...                 .........
...GHI...                 .........
.........                 C......AB
文件读入currentgen,字符串 vector
nextgen是currentgen的副本,我可以根据需要进行更改
//find neighbors
    for (size_t i=0; i < currentgen.size(); i++){
                for(size_t j = 0; j < currentgen[0].length(); j++){ 
                //neighbor count
                int neighborcount = 0;
                //south neighbor
                if(currentgen[(i+1) % currentgen.size()][j] == 'O'){
                    neighborcount++;
                }
                //north
                if(currentgen[(i-1) % currentgen.size()][j] == 'O'){
                    neighborcount++;
                }
                
                //left
                if(currentgen[i][(j-1) % currentgen[i].length()] == 'O'){
                    neighborcount++;
                }
                
                //right
                if(currentgen[i][(j+1) % currentgen[i].length()] == 'O'){
                    neighborcount++;
                }
                
                //south right
                if(currentgen[(i+1) % currentgen.size()]
                [(j+1) % currentgen[i].length()] == 'O'){
                    neighborcount++;
                }
                
                //south left
                if(currentgen[(i+1) % currentgen.size()]
                [(j-1) % currentgen[i].length()] == 'O'){
                    neighborcount++;
                }
                
                //north right
                if(currentgen[(i-1) % currentgen.size()]
                [(j+1) % currentgen[i].length()] == 'O'){
                    neighborcount++;
                }
                //north left
                if(currentgen[(i-1) % currentgen.size()]
                [(j-1) % currentgen[i].length()] == 'O'){
                    neighborcount++;
                }
                
                //if cell is alive
                if(currentgen[i][j] == 'O'){
                    nextgen[i][j] = '.';
                    if(neighborcount == 2){
                    nextgen[i][j]= 'O';
                    }
                    if(neighborcount == 3){
                    nextgen[i][j]= 'O';
                    }
                    
                
                }
                
                //if cell is dead
                if(currentgen[i][j] == '.'){
                    if(neighborcount == 3){
                    nextgen[i][j]= 'O';
                
                    }
                }

最佳答案

代码的问题在于您所依赖的%具有剩余部分的通常含义。但是,在c++中,对负值执行%将使您的余数接近0。
所以下面的表达式是:

-1 % 5 // -1 not 4
为了正确处理余数,可以将您使用的值添​​加为模数,然后确保您有一个正数,并且计算将起作用:
(-1 + 5) % 5  // 4 yay!!

另外,所有用于检查邻居的if条件都非常冗长。您可以将其简化为:
for (size_t i=0; i < currentgen.size(); i++) {
  for(size_t j = 0; j < currentgen[0].length(); j++) { 
    //neighbor count
    int neighborcount = 0;
    for (int i_offset : {-1, 0, 1})
      for (int j_offset : {-1, 0, 1}) 
        if (i && j && currentgen[(i + i_offset + currentgen.size()) 
                                 % currentgen.size()]
                                [(j + j_offset + currentgen[i].size()) 
                                 % currentgen[i].size()] == 'O')
          neighborcount++;
 
    //if cell is alive
    // ... etc

关于c++ - 如何检查字符串 vector 中字符的所有邻居,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64069306/

相关文章:

c++ - 通过 unique_ptr 和自定义删除器使用自动扣除

c++ - 如何编写具有 cout 样式接口(interface)的记录器类 (logger << "Error: "<< val << endl;)

c++ - 如何将箭头::数组转换为标准:: vector ?

c++ - 从函数返回结构,如何检查它是否已初始化?

c++ - 按 unordered_map 中的结构数据排序

matlab - 计算数组中的重复整数

r - 如何从向量中删除某些项目?

c++ - 无法在 C++17 之前的模式下使用 static constexpr 进行编译

c++ - 有什么方法可以在函数参数中标记输出?

c++ - `std::pmr::monotonic_buffer_resource` : why the `dynamic_cast` ?