• OpenJudge计算概论-流感传染【这个题用二维数组】


    /*==========================================================
    流感传染
    总时间限制: 1000ms 内存限制: 65536kB
    描述
    有一批易感人群住在网格状的宿舍区内,宿舍区为n*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感,(已经得病的不变),空房间不会传染。请输出第m天得流感的人数。
    
    输入
    第一行一个数字n,n不超过100,表示有n*n的宿舍房间。
    接下来的n行,每行n个字符,’.’表示第一天该房间住着健康的人,’#’表示该房间空着,’@’表示第一天该房间住着得流感的人。
    接下来的一行是一个整数m,m不超过100.
    输出
    输出第m天,得流感的人数
    样例输入
    5
    ....#
    .#.@.
    .#@..
    #....
    .....
    4
    样例输出
    16
    ============================================================*/ 
    #include<stdio.h>
    #include<string.h>
    char a[100][100],b[100][100],n;//b数组是做为暂存中间结果的数组,以免今天刚感染的那些人对他周围的人马上也传染过去。 
    void fun(int i,int j);//使a[i][j]周围的人感染流感 
    int main()
    {
        int m,i,j,k,s;
        
        freopen("7.in","r",stdin);
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
            scanf("%s",a[i]);
            strncpy(b[i],a[i],n);
        }
        scanf("%d",&m);
        for(k=2;k<=m;k++)
        {
            for(i=0;i<n;i++)
            {
                for(j=0;j<n;j++)
                {
                    if(a[i][j]=='@')//这里是检测病人然后处理其周围的人。其实也可检测正常人然后看他周围是否有病人会传染给他。不过,其实道理都一样,也要存储中间结果。 
                    {
                        fun(i,j);
                    }
                }
            }
            for(i=0;i<n;i++)
            {
                strncpy(a[i],b[i],n);
            }
        }
        s=0;
        for(i=0;i<n;i++)
           {
            /*printf("%s
    ",a[i]);*/
            for(j=0;j<n;j++)
            {
                if(a[i][j]=='@')
                {
                    s++;
                }
            }
        }
        printf("%d
    ",s);
        return 0;
    }
    void fun(int i,int j)
    {
        int x,y;
        x=i-1;y=j;
        if(x>=0&&a[x][y]=='.')//注意:这个地方的两个条件不能调整先后顺序,否则当x<0时先判断a[x][y]是否等于‘.’就错了,下标越界了。 
        {
            b[x][y]='@';
        }
        x=i+1;y=j;
        if(x<n&&a[x][y]=='.')//注意:这个地方的两个条件不能调整先后顺序,否则当x>=n时先判断a[x][y]是否等于‘.’就错了,下标越界了。 
        {
            b[x][y]='@';
        }
        x=i;y=j-1;
        if(y>=0&&a[x][y]=='.')//注意:这个地方的两个条件不能调整先后顺序,否则当y<0时先判断a[x][y]是否等于‘.’就错了,下标越界了。 
        {
            b[x][y]='@';
        }
        x=i;y=j+1;
        if(y<n&&a[x][y]=='.')//注意:这个地方的两个条件不能调整先后顺序,否则当y>=n时先判断a[x][y]是否等于‘.’就错了,下标越界了。 
        {
            b[x][y]='@';
        }
    }

     下面是另外一个方法,可以把新感染的人标记为其他符号,这样就免掉了另外一个数组,可以省一点空间。

     1 #include<iostream>
     2 #include<stdio.h>
     3 using namespace std;
     4 int main()
     5 {
     6     char a[100][100];
     7     int i,n,j,d,m,sum=0;
     8     freopen("5.in","r",stdin);
     9     //freopen("result.out","w",stdout);
    10     cin>>n;
    11     for(i=0;i<n;i++)
    12     {
    13         for(j=0;j<n;j++)
    14         {
    15             cin>>a[i][j];
    16         }
    17     }
    18     cin>>m;
    19     /*调试性输出
    20     for(i=0;i<n;i++)
    21     {
    22         for(j=0;j<n;j++)
    23         {
    24             cout<<a[i][j];
    25         }
    26         cout<<endl;
    27     }*/
    28 
    29     for(d=2;d<=m;d++)
    30     {
    31         for(i=0;i<n;i++)
    32         {
    33             for(j=0;j<n;j++)
    34             {
    35                 if(a[i][j]=='@')
    36                 {
    37                     if(i+1<n&&a[i+1][j]=='.')
    38                       a[i+1][j]='!';
    39                     if(j-1>=0&&a[i][j-1]=='.')
    40                       a[i][j-1]='!';
    41                     if(j+1<n&&a[i][j+1]=='.')
    42                       a[i][j+1]='!';
    43                     if(i-1>=0&&a[i-1][j]=='.')
    44                       a[i-1][j]='!';
    45                 }
    46             }
    47         }
    48         /*调试性输出
    49         cout<<endl<<"===========第"<<d<<"天================"<<endl;
    50         for(i=0;i<n;i++)
    51         {
    52             for(j=0;j<n;j++)
    53             {
    54                 cout<<a[i][j];
    55             }
    56             cout<<endl;
    57         }*/
    58         for(i=0;i<n;i++)
    59         {
    60             for(j=0;j<n;j++)
    61             {
    62                 if(a[i][j]=='!')
    63                   a[i][j]='@';
    64             }
    65         }
    66     }
    67     sum=0;
    68     for(i=0;i<n;i++)
    69     {
    70         for(j=0;j<n;j++)
    71         {
    72             if(a[i][j]=='@')
    73               sum++;
    74         }
    75     }
    76     cout<<sum<<endl;
    77     return 0;
    78 }

     简陋的递归:

     1 #include<iostream>
     2 #include<stdio.h>
     3 using namespace std;
     4 
     5 char a[100][100];
     6 int n,m;
     7 
     8 void fun(int k);//表示当前根据第k-1天的结果计算第k天的数据 
     9 
    10 int main()
    11 {
    12     int i,j,d,sum=0;
    13     //freopen("data.in","r",stdin);
    14     cin>>n;
    15     for(i=0;i<n;i++)
    16     {
    17         for(j=0;j<n;j++)
    18         {
    19             cin>>a[i][j];
    20         }
    21     }
    22     cin>>m;
    23     /*调试性输出
    24     for(i=0;i<n;i++)
    25     {
    26         for(j=0;j<n;j++)
    27         {
    28             cout<<a[i][j];
    29         }
    30         cout<<endl;
    31     }*/
    32     fun(2);
    33     sum=0;
    34     for(i=0;i<n;i++)
    35     {
    36         for(j=0;j<n;j++)
    37         {
    38             if(a[i][j]=='@')
    39               sum++;
    40         }
    41     }
    42     cout<<sum<<endl;
    43     return 0;
    44 }
    45 void fun(int k)//表示当前根据第k-1天的结果计算第k天的数据 
    46 {
    47     int i,j;
    48     if(k>m) return;
    49     else
    50     {
    51         for(i=0;i<n;i++)
    52         {
    53             for(j=0;j<n;j++)
    54             {
    55                 if(a[i][j]=='@')
    56                 {
    57                     if(i+1<n&&a[i+1][j]=='.')  a[i+1][j]='!';
    58                     if(j-1>=0&&a[i][j-1]=='.') a[i][j-1]='!';
    59                     if(j+1<n&&a[i][j+1]=='.')  a[i][j+1]='!';
    60                     if(i-1>=0&&a[i-1][j]=='.') a[i-1][j]='!';
    61                  }
    62             }
    63         }
    64     
    65         for(i=0;i<n;i++)
    66         {
    67             for(j=0;j<n;j++)
    68             {
    69                 if(a[i][j]=='!')
    70                     a[i][j]='@';
    71             }
    72         }
    73         /*printf("
    ----------------------------------
    ");
    74         for(i=0;i<n;i++)
    75         {
    76             for(j=0;j<n;j++)
    77             {
    78                 cout<<a[i][j];
    79             }
    80             cout<<endl;
    81         }*/
    82         fun(k+1);
    83     }    
    84 }
  • 相关阅读:
    python 线程队列PriorityQueue(优先队列)(37)
    python 线程队列LifoQueue-LIFO(36)
    python线程队列Queue-FIFO(35)
    python线程障碍对象Barrier(34)
    关于mybatis 在C#.Net中批量增,删,改
    c#如实现将一个数字转化为其他进制字符串输出
    Tostring(); 括号中的参数 格式化字符串
    前端笔记之HTML5&CSS3(上)新特性&音频视频&本地存储&自定义属性
    前端笔记之jQuery(下)事件&节点操作&净位置&拖拽&页面卷动值&遍历JSON
    前端笔记之jQuery(上)加载函数的区别&对象&操作HTML/CSS&动画&选择器
  • 原文地址:https://www.cnblogs.com/huashanqingzhu/p/3455901.html
Copyright © 2020-2023  润新知