c++ 关于流感传染这个算法哪里有问题?

描述

有一批易感人群住在网格状的宿舍区内,宿舍区为 n*n 的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感,(已经得病的不变),空房间不会传染。请输出第m天得流感的人数。

输入
第一行一个数字 n,n 不超过 100,表示有 n*n 的宿舍房间。
接下来的 n 行,每行 n 个字符,’.’ 表示第一天该房间住着健康的人,’#’ 表示该房间空着,’@’ 表示第一天该房间住着得流感的人。
接下来的一行是一个整数 m,m 不超过 100.

输出

输出第m天,得流感的人数

样例输入

5
....#
.#.@.
.#@..
#....
.....
4

样例输出

16

以下为代码

#include<iostream>
using namespace std;
int main(){
    int n,m;
    char nn[100][100]={};
    cin>>n;
    for(int i=0;i<n;i++) //输入数组;
        for(int j=0;j<n;j++)
            cin>>nn[i][j];

    cin>>m;
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++) // 如果这个数得了流感,并且旁边住着健康的人,把被转染者先替代为*
            for(int k=0;k<n;k++){
                if(nn[j][k]=='@' && nn[j+1][k]=='.' )
                    nn[j+1][k]='*';
                if(nn[j][k]=='@' && nn[j-1][k]=='.')
                    nn[j-1][k]='*';
                if(nn[j][k]=='@' && nn[j][k+1]=='.')
                    nn[j][k+1]='*';
                if(nn[j][k]=='@' && nn[j][k-1]=='.')
                    nn[j][k-1]='*';
            }

        for(int l=0;l<n;l++) //把*换为@
            for(int p=0;p<n;p++){
                if(nn[l][p]=='*')
                    nn[l][p]='@';
            }    
    } 

    int num=0; //计数并输出。
    for(int j=0;j<n;j++)
            for(int k=0;k<n;k++){
                if(nn[j][k]=='@')
                    num++;
            }        
     cout<< num;
    return 0;
    }
阅读 4.2k
2 个回答

粗略地看了一眼,j和k都是从0开始的,那[j-1][k][j][k-1]不就挂了

新手上路,请多包涵

用队列试一试,广度优先遍历,用for循环显然有些问题,比如你取m=1,没细看代码……

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题