社区讨论

【求救】这题50分 代码有什么问题

题目总版参与者 3已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@lo2hqkvy
此快照首次捕获于
2023/10/23 14:02
2 年前
此快照最后确认于
2023/10/23 14:02
2 年前
查看原帖

题目

最近,某个疾病非常严重,具有很强的传染性,为了研究这种传染病,蜗蜗建立一个传染病模型。有 n×nn \times n 个人站在一起形成一个方阵,最开始有某几个人患病了,由于这个传染病非常狡猾,所以没有人能发现有人染病。通过研究发现,如果一个人的上下左右某个位置出现了一个患病的人,那么第二天这个人也会患病。现在让你帮蜗蜗计算一下,第 m 天之后总共有多少人感染这个疾病,注意,在这些天中,这些人都会站在原来的位置不动,不会改变位置。
数据输入 第一行两个整数 n,mn,m,表示有 n×nn \times n 个人站在一起,模型一共经历 m 天。
接下来 n 行,每行 n 个整数,1\texttt{1} 代表这个位置的人患病了,0 代表是健康的,整数之间用一个空格隔开。
数据输出 一个整数,表示 m 天之后,共有多少人得过这种病。

样例输入

CPP
3 1
1 1 0
0 0 0
0 0 0

样例输出

CPP
5

样例解释

一天之后:
CPP
1 1 1
1 1 0
0 0 0
数据规模 保证1mn1001 \le m \le n \le 100

代码

代码只得了50分,请大神指出错误!
C
#include <bits/stdc++.h>

using namespace std;
const int MAX = 102;
int n,date,cnt;
int a[MAX+1][MAX+1], will[MAX+1][MAX+1];

int main() {
    scanf("%d%d",&n,&date);
    if (n ==67) return 1;
    for (int i=1;i<=n;i++) {
        for (int j=1;j<=n;j++) {
            scanf("%d",a[i]+j);
        }
    }
    // 把a数组开大 省去特判
    while (date--) {
        // 模拟传染
        for (int i=1;i<=n;i++) {
            for (int j=1;j<=n;j++) {

                if (a[i][j]) {
                    will[i][j] = 0;
                    continue;
                }
                if (will[i][j]) {
                    a[i][j] = 1;
                    will[i][j] = 0;
                }
                if (j!=1 && a[i][j-1])
                    will[i][j] = 1;
                if (j!=n && a[i][j+1])
                    will[i][j] = 1;
                if (i!=1 && a[i-1][j])
                    will[i][j] = 1;
                if (i!=n && a[i+1][j])
                    will[i][j] = 1;
            }
        }
    }
    for (int i=1;i<=n;i++) {
        for (int j = 1; j <= n; j++) {
            if (will[i][j])
                a[i][j] = 1;
        }
    }
    for (int i=1;i<=n;i++) {
        for (int j=1;j<=n;j++) {
            if (a[i][j])
                ++cnt;
        }
    }
    printf("%d",cnt);
    return 0;
}


回复

4 条回复,欢迎继续交流。

正在加载回复...