题解 | #扫雷#

扫雷

https://www.nowcoder.com/practice/d5f277427d9a4cd3ae60ea6c276dddfd

#include <stdio.h>

//在VS上编译出简单扫雷之后 在牛客上的初次尝试 所以思路是按照我第一次的思路走 所以会略显呆板 见谅。
//可谓 同样的效果 千种的代码 学海无涯 仍需不断的学习

int main() 
{   
    int a,b;
    scanf("%d %d",&a,&b);
    //雷 数组声明
    char mine[a+2][b+2];
    //初始化 雷数组 比输入的雷矩阵大一圈 方便使用 九宫格循环遍历 统计雷数
    for (int i = 0 ; i < a+2 ; i++)
    {
        for (int j = 0; j < b+2 ; j++)
        {
            mine[i][j] = '0';
        }
    }

    //扫雷 数组声明
    char show[a+2][b+2];
    //遍历输入字符 下标从 1 到 a+1 
    for (int i = 1 ; i < a+1 ; i++)
    {
        for (int j = 1 ; j < b+1 ; j++)
        {
            //scanf这里一定要注意" %c" ,没有空格这里就会出错 虽然有了getchar() 还是得加上空格
            scanf(" %c",&mine[i][j]);
        }
        //吸收回车'\n'  也可用 while(getchar() != '\n');
        getchar();
    }

    //循环遍历 雷矩阵
    for (int i = 1 ; i < a+1 ; i++)
    {
        for (int j = 1 ; j < b+1 ; j++)
        {
            //如果此位置是不是雷
            if(mine[i][j] != '*')
            {
                //计数变量 用作记录雷的数量 用于表达在 扫雷数组里
                int count = 0;
                //九宫格循环遍历 统计雷数
                for(int m = -1 ; m < 2 ; m++)
                {
                    for(int n = -1 ; n < 2 ; n++)
                    {
                        //判断 如果是雷 则count++
                        if (mine[i+m][j+n] == '*')
                        {
                            count++;
                        }
                    }
                }
                //将数字count加上'0'后变为字符 'count' ,因为 '0'的ASCII码值为 48(是多少都一样) 主要是'0'后面字符都是连续的'48+1'即为'1'
                show[i][j] = count + '0';                
            }
            //否则 如果此位置是雷 仍输出'*'
            else 
            show[i][j] = '*';
        }
    }

    //循环遍历打印 show扫雷数组
    for (int i = 1 ; i < a+1 ; i++)
    {
        for (int j = 1 ; j < b+1 ; j++)
        {
            printf("%c",show[i][j]);
        }
        //每打印一行 记得换行
        printf("\n");
    }    
    return 0;
}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务