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

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;
    }


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


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

【热门文章】
【热门文章】