所以,我的问题是: 我有一个平方矩阵,代表一个有疫情的社区,矩阵中的每个细胞代表一所房子.房子有三种不同的情况,S生病了,H痊愈了,C传染了.我有几天的时间,然后我改变了社区的初始情况,每天我都会按照即将到来的规则改变社区:

  • 如果房子是‘H’,它的上/下/左/右邻居是‘C’,它就变成了‘C’房子(不是对角线).
  • 如果房子是‘C’,并且至少有两个‘C’邻居变成了‘S’房子(在这种情况下,邻居是上/下/左/右/对角线,这里我们有8个不同的 Select ).
  • 如果房子是‘S’,那么它就变成‘H’房子.

这不是一个棘手的问题,但我的问题是,如果我能为边缘情况写一个更简单的条件.

这是一个函数,用于判断房屋为‘C’时的边缘情况:

void limit_C(char **neigh, int i, int j, int d, char **help)
{
    int counter = 0;

    if ((i == 0) && (j == 0))
   {
       if(help[i + 1][j] == CONTAGIOUS)
       {counter++;}
           
          if(help[i][j + 1] == CONTAGIOUS)
          {counter++;}
       
          if(help[i + 1][j + 1] == CONTAGIOUS)
          {counter++;}
       
           if(counter >= 2)
           {neigh[i][j] = SICK;}
       
   }
   else if ((i == d - 1) && (j == d - 1))
   {
         if(help[i - 1][j] == CONTAGIOUS)
        {counter++;}
       
         if(help[i][j - 1] == CONTAGIOUS)
         {counter++;}
       
         if(help[i - 1][j - 1] == CONTAGIOUS)
        {counter++;}
       
       if(counter >= 2)
            {neigh[i][j] = SICK;}
   }
       
   else if ((i == d - 1) && (j == 0))
   {
          if(help[i - 1][j] == CONTAGIOUS)
          {counter++;}
       
          if(help[i][j + 1] == CONTAGIOUS)
          {counter++;}
       
          if(help[i - 1][j + 1] == CONTAGIOUS)
          {counter++;}
       
       if(counter >= 2)
            {neigh[i][j] = SICK;}
   }
   else if ((i == 0) && (j == d - 1))
   {
          if(help[i + 1][j] == CONTAGIOUS)
          {counter++;}
       
          if(help[i][j - 1] == CONTAGIOUS)
          {counter++;}
       
          if(help[i + 1][j - 1] == CONTAGIOUS)
          {counter++;}
       
       if(counter >= 2)
            {neigh[i][j] = SICK;}
       
   }
   
  else if((i == 0) && (j != 0))
   {
          if(help[i][j + 1] == CONTAGIOUS)
          {counter++;}
           
          if(help[i][j - 1] == CONTAGIOUS)
          {counter++;}
       
          if(help[i + 1][j] == CONTAGIOUS)
          {counter++;}
       
          if(help[i + 1][j + 1] == CONTAGIOUS)
          {counter++;}
       
          if(help[i + 1][j - 1] == CONTAGIOUS)
          {counter++;}
       
       if(counter >= 2)
       {neigh[i][j] = SICK;}
       
   }
   
   else if ((i != 0) && (j == 0))
   {
          if(help[i][j + 1] == CONTAGIOUS)
          {counter++;}
       
          if(help[i - 1][j] == CONTAGIOUS)
          {counter++;}
       
          if(help[i + 1][j] == CONTAGIOUS)
          {counter++;}
       
          if(help[i - 1][j + 1] == CONTAGIOUS)
          {counter++;}
       
          if(help[i + 1][j + 1] == CONTAGIOUS)
          {counter++;}
      
       if(counter >= 2)
       {neigh[i][j] = SICK;}
       
   }
    else if((i == d - 1) && (j != d - 1))
    {
        if(help[i - 1][j] == CONTAGIOUS)
        {counter++;}
        
        if(help[i][j + 1] == CONTAGIOUS)
        {counter++;}
        
        if(help[i][j - 1] == CONTAGIOUS)
        {counter++;}
        
        if(help[i - 1][j + 1] == CONTAGIOUS)
        {counter++;}
        
        if(help[i - 1][j - 1] == CONTAGIOUS)
        {counter++;}
        
        if(counter >= 2)
        {neigh[i][j] = SICK;}
        
        
    }
    
    else if((i != d - 1) && (j == d - 1))
    {
        if(help[i - 1][j] == CONTAGIOUS)
        {counter++;}
        
        if(help[i + 1][j] == CONTAGIOUS)
        {counter++;}
        
        if(help[i][j - 1] == CONTAGIOUS)
        {counter++;}
        
        if(help[i - 1][j - 1] == CONTAGIOUS)
        {counter++;}
        
        if(help[i + 1][j - 1] == CONTAGIOUS)
        {counter++;}
        
        if(counter >= 2)
        {neigh[i][j] = SICK;}
        
    }
}

那么,有没有更简单的方法来编写相同的代码呢?

推荐答案

而不是像这样的代码:

   if(help[i + 1][j] == CONTAGIOUS)
   {counter++;}

我会引入一个帮助器函数来进行比较.类似于:

int is_C(char **neigh, int i, int j, int d)
{
    if (i < 0) return 0;
    if (i >= d) return 0;
    if (j < 0) return 0;
    if (j >= d) return 0;
    return neigh[i][j] == CONTAGIOUS;
}

有了辅助函数,您就不需要担心边缘情况了.只需判断所有8个邻居.

int count_C(char **neigh, int i, int j, int d)
{
    int cnt = 0;
    cnt += is_C(neigh, i-1, j-1, d);
    cnt += is_C(neigh, i-1, j, d);
    cnt += is_C(neigh, i-1, j+1, d);
    cnt += is_C(neigh, i, j-1, d);
    cnt += is_C(neigh, i, j+1, d);
    cnt += is_C(neigh, i+1, j-1, d);
    cnt += is_C(neigh, i+1, j, d);
    cnt += is_C(neigh, i+1, j+1, d);
    return cnt;
}

然后您就有了如下所示的简单代码:

for (int i = 0; i < d; ++i)
{ 
    for (int j = 0; j < d; ++j)
    { 
        if (neigh[i][j] == CONTAGIOUS && count_C(neigh, i, j, d) >= 2)
        {
            neigh[i][j] = SICK;  // or tmp_neigh[i][j] = SICK; See note
        }
     }
}

note:"游戏"的规则可能需要一个临时矩阵来保存更新期间的新状态.

C++相关问答推荐

strftime函数中%s的历史意义是什么?为什么没有记录?

球体—立方体重叠:无、部分或全部?

来自stdarg.h的c中的va_args无法正常工作<>

编译的时候g++通常会比GCC慢很多吗?

减法运算结果的平方的最快方法?

使用sscanf获取零个或多个长度的字符串

如何在C语言中正确打印图形

将 struct 传递给函数

在创建动态泛型数组时,通过realloc对故障进行分段

理解bzip2的BZ2_解压缩函数中的状态重新分配

宏观;S C调深度

如何在不更改格式说明符的情况下同时支持双精度和长双精度?

`%%的sscanf无法按预期工作

#define X Defined(Y) 是有效的 C/C++ 宏定义吗?

在 C 中传递参数时出现整数溢出

GDB 用内容初始化数组

在 printf() 格式说明符中使用字段宽度变量

C 初学者 - struct 中的字符串不需要 Malloc

使用字符数组声明和字符指针声明进行定义时,c 中的文字如何存储?

C 中的变量参数