m0_74153183 2022-11-07 22:58 采纳率: 95.5%
浏览 62
已结题

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

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

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

  • 写回答

1条回答 默认 最新

  • 谢玄. 2022-11-09 15:27
    关注

    如果你的布局是这样子
    你的读取存在问题,回车会读进去,还有加和时,会溢出,比如 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;//愉快的结束了主程序
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 11月17日
  • 已采纳回答 11月9日
  • 修改了问题 11月7日
  • 修改了问题 11月7日
  • 展开全部

悬赏问题

  • ¥15 Odoo17操作下面代码的模块时出现没有'读取'来访问
  • ¥50 .net core 并发调用接口问题
  • ¥15 网上各种方法试过了,pip还是无法使用
  • ¥15 用verilog实现tanh函数和softplus函数
  • ¥15 Hadoop集群部署启动Hadoop时碰到问题
  • ¥15 求京东批量付款能替代天诚
  • ¥15 slaris 系统断电后,重新开机后一直自动重启
  • ¥15 QTableWidget重绘程序崩溃
  • ¥15 谁能帮我看看这拒稿理由啥意思啊阿啊
  • ¥15 关于vue2中methods使用call修改this指向的问题