萌新求助,遇到了十分玄学的问题
查看原帖
萌新求助,遇到了十分玄学的问题
139781
Darth_Vader丶楼主2021/7/8 00:06

纯萌新提问,劳驾洛谷各路大神拨冗解答!万分感谢!

先看一段20分代码,只过了#2#3两个点:

#include<cstdio>
using namespace std;
int n,m;
char c;
int x;
bool a[1000][1000]={0};
int main() {
    scanf("%d %d\r\n",&n,&m);
    for (int i=1;i<=n;i++) {
        for (int j=1;j<=m;j++) {
            c=getchar();
            //putchar(c);
            switch (c) {
                case'*': a[i][j]=1;break;
                case'?': a[i][j]=0;break;
            }
        }
        getchar();
        getchar();
    }
    for (int i=1;i<=n;i++) {
        for (int j=1;j<=m;j++) {
            if (a[i][j]==1) printf("*"),x=0;
            else {
                for (int k=i-1;k<=i+1;k++)
                    for (int t=j-1;t<=j+1;t++) 
                        if (a[k][t]==1) x++;
                printf("%d",x);
                x=0;
            }
        }
        printf("\r\n");
    }
    return 0;
}

稍微解释一下。

  1. 纯模拟,两次getchar滤过换行符等奇怪的东西
  2. 后半段对a[][]判断:若a[][]为1则有雷;若为0则不影响x的数值,因此直接两个for循环统计9个格子的雷数(1的数目)之和(存在x里面)

所以为啥只有20?

再看另一段AC代码:

#include<cstdio>
using namespace std;
int n,m;
char c;
int x;
bool a[1000][1000]={0};
int main() {
    scanf("%d %d\r\n",&n,&m);
    for (int i=1;i<=n;i++) {
        for (int j=1;j<=m;j++) {
            c=getchar();
            //putchar(c);
            while (!(c=='*'||c=='?'))//仅此处有所改动!
                c=getchar();
            switch (c) {
                case'*': a[i][j]=1;break;
                case'?': a[i][j]=0;break;
            }
        }
    }
    for (int i=1;i<=n;i++) {
        for (int j=1;j<=m;j++) {
            if (a[i][j]==1) printf("*"),x=0;
            else {
                for (int k=i-1;k<=i+1;k++)
                    for (int t=j-1;t<=j+1;t++) 
                        if (a[k][t]==1) x++;
                printf("%d",x);
                x=0;
            }
        }
        printf("\r\n");
    }
    return 0;
}

这是同学指教的,然后莫名其妙就过了。

上述两个代码有何不同?问题出在哪里?求高人指点!

谢谢!!!

2021/7/8 00:06
加载中...