(扫雷)我用测试样例做对了,为什么评测过不了

问题遇到的现象和发生背景

img

用代码块功能插入代码,请勿粘贴截图
#include<stdio.h>
int main()
{
    int m, n;
    char a[100][100];
    int count[100][100];
    scanf("%d%d", &m, &n);
    setbuf(stdin, NULL);
    /*fflush(stdin);*/
    for (int i =1; i <=m; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            scanf("%c", &a[i][j]);
        }
        setbuf(stdin, NULL);
        /*fflush(stdin);*/
    }
    for (int i =1; i <= m; i++)
    {
        for (int j =1; j <= n; j++)
        {
            if (i > 0) {
                if (a[i - 1][j] == '*')
                    count[i][j]++;
                if (a[i - 1][j - 1] == '*')
                    count[i][j]++;
                if (a[i - 1][j + 1] == '*')
                    count[i][j]++;
                if (a[i][j - 1] == '*')
                    count[i][j]++;
                if (a[i][j + 1] == '*')
                    count[i][j]++;
                if (a[i + 1][j] == '*')
                    count[i][j]++;
                if (a[i + 1][j - 1] == '*')
                    count[i][j]++;
                if (a[i + 1][j + 1] == '*')
                    count[i][j]++;
            }
        }
    }
    for (int i = 1; i <= m; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            if (a[i][j] == '?')
                a[i][j] = '0' + count[i][j];
        }
    }
    for (int i = 1; i <= m; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            printf("%c", a[i][j]);
        }
        printf("\n");
    }
    return 0;
}


```#include<stdio.h>
//#include<stdlib.h>
int a[105][105]={0};//一张地图,有雷为一,无雷为零 
int main()
{
    //memset(a, 0, sizeof(a));//地图最开始清空 
    //int b[105][105];//一张地图,有雷为一,无雷为零 
    int n, m;
    char tmp[105][105];
    scanf("%d%d", &m, &n);
    /*setbuf(stdin, NULL);*/
    for (int i = 1; i <=m; i++)//读入地图
    {
        for (int j = 1; j <=n; j++)
        {
            scanf("%c",&tmp[i][j]);
            if (tmp[i][j] == '*') 
                a[i][j] = 1;//如果是地雷就将这个点设为一 
        }
    }
    for (int i = 1; i <= m; i++)
    {
        for (int j = 1; j <= n; j++)
        {
            if (a[i][j] == 1) printf("*"); //如果是地雷不用输出数字 
            else
            {
                printf("%d", a[i + 1][j + 1] + a[i + 1][j - 1] + a[i + 1][j] + a[i][j + 1] + a[i][j - 1] + a[i - 1][j + 1] + a[i - 1][j] + a[i - 1][j - 1]);
                //将旁边的雷加起来输出 (旁边的雷直接变成1)
            }
        }
        printf("\n");
    }
    return 0;//愉快的结束了主程序 
}
我换了一种解法还是过不了

```c


img

运行结果及报错内容

img


但是我自己输入时都对啊

img

如果你的布局是这样子
你的读取存在问题,回车会读进去,还有加和时,会溢出,比如 a[-1][1]就明显溢出了。


#include<stdio.h>
//#include<stdlib.h>
int a[105][105] = {0}; //一张地图,有雷为一,无雷为零
int main() {
    //memset(a, 0, sizeof(a));//地图最开始清空
    //int b[105][105];//一张地图,有雷为一,无雷为零
    int n, m;
    char tmp[105][105] = {0};
    scanf("%d%d", &m, &n);
    setbuf(stdin, NULL);
    for (int i = 0; i < m; i++) { //读入地图
        for (int j = 0; j < n; j++) {
            do {
                //TODO
                scanf("%c", &tmp[i][j]);
            } while ( tmp[i][j] != '*' && tmp[i][j] != '?'  );

            if (tmp[i][j] == '*') {
                a[i][j] = 1;//如果是地雷就将这个点设为一
            }
        }
    }
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            if (a[i][j] == 1) printf("*"); //如果是地雷不用输出数字
            else {
                int up = i - 1 >= 0 ? i - 1 : -1;
                int down = i + 1 < n ? i + 1 : -1;
                int lift = j - 1 >= 0 ? j - 1 : -1;
                int right = j + 1 < n ? j + 1 : -1;
                int num  = 0;
                if ( up != -1 ) {
                    if ( lift != -1 ) {
                        num += a[up][lift];
                    }
                    num += a[up][j];
                    if ( right != -1 ) {
                        num += a[up][right];
                    }
                }
                if (down != -1) {
                    if ( lift != -1 ) {
                        num += a[down][lift];
                    }
                    num += a[down][j];
                    if ( right != -1 ) {
                        num += a[down][right];
                    }
                }
                if( lift != -1 ){
                    num+=a[i][lift];
                }
                if( right != -1 ){
                    num+=a[i][right];
                }
                printf("%d", num);
                //将旁边的雷加起来输出 (旁边的雷直接变成1)
            }
        }
        printf("\n");
    }
    return 0;//愉快的结束了主程序
}