穆思成
本帖最后由 穆思成 于 2020-7-3 10:55 编辑

题目来源
https://www.luogu.com.cn/problem/P2670

题目描述
扫雷游戏是一款十分经典的单机小游戏。在nn行mm列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。
现在给出nn行mm列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。
注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的格子。

输入格式
第一行是用一个空格隔开的两个整数nn和mm,分别表示雷区的行数和列数。
接下来nn行,每行mm个字符,描述了雷区中的地雷分布情况。字符’*’表示相应格子是地雷格,字符’?’表示相应格子是非地雷格。相邻字符之间无分隔符。

输出格式
输出文件包含nn行,每行mm个字符,描述整个雷区。用’*’表示地雷格,用周围的地雷个数表示非地雷格。相邻字符之间无分隔符。

输入输出样例输入 #1
3 3
*??
???
?*?输出 #1
*10
221
1*1

输入 #22 3
?*?
*??
输出 #2

2*1
*21

说明/提示
对于100%的数据,1≤n≤100,1≤m≤100。

我的题解
  1. #include <iostream>

  2. using namespace std;

  3. bool itrans();

  4. int main()
  5. {
  6.         int n, m, count = 0;
  7.         cin >> n >> m;
  8.         bool** in = new bool* [n];
  9.         char** out = new char* [n];
  10.         for (int i = 0; i < n; i++)
  11.         {
  12.                 in[i] = new bool[m];
  13.                 out[i] = new char[m];
  14.                 for (int j = 0; j < m; j++)
  15.                 {
  16.                         in[i][j] = itrans();
  17.                         if (in[i][j] == 1)
  18.                         {
  19.                                 out[i][j] = '*';
  20.                         }
  21.                 }
  22.         }
  23.         for (int i = 0; i < n; i++)
  24.         {
  25.                 for (int j = 0; j < m; j++)
  26.                 {
  27.                         if (in[i][j] == 0)
  28.                         {
  29.                                 if (i >= 1)
  30.                                 {
  31.                                         if (in[i - 1][j] == 1)
  32.                                         {
  33.                                                 count++;
  34.                                         }
  35.                                         if (j >= 1)
  36.                                         {
  37.                                                 if (in[i - 1][j - 1] == 1)
  38.                                                 {
  39.                                                         count++;
  40.                                                 }
  41.                                         }
  42.                                         if (j <= m - 2)
  43.                                         {
  44.                                                 if (in[i - 1][j + 1] == 1)
  45.                                                 {
  46.                                                         count++;
  47.                                                 }
  48.                                         }
  49.                                 }
  50.                                 if (i <= n - 2)
  51.                                 {
  52.                                         if (in[i + 1][j] == 1)
  53.                                         {
  54.                                                 count++;
  55.                                         }
  56.                                         if (j >= 1)
  57.                                         {
  58.                                                 if (in[i + 1][j - 1] == 1)
  59.                                                 {
  60.                                                         count++;
  61.                                                 }
  62.                                         }
  63.                                         if (j <= m - 2)
  64.                                         {
  65.                                                 if (in[i + 1][j + 1] == 1)
  66.                                                 {
  67.                                                         count++;
  68.                                                 }
  69.                                         }
  70.                                 }
  71.                                 if (j >= 1)
  72.                                 {
  73.                                         if (in[i][j - 1] == 1)
  74.                                         {
  75.                                                 count++;
  76.                                         }
  77.                                 }
  78.                                 if (j <= m - 2)
  79.                                 {
  80.                                         if (in[i][j + 1] == 1)
  81.                                         {
  82.                                                 count++;
  83.                                         }
  84.                                 }
  85.                                 out[i][j] = count + '0';
  86.                                 count = 0;
  87.                         }
  88.                 }
  89.         }
  90.         for (int i = 0; i < n; i++)
  91.         {
  92.                 for (int j = 0; j < m; j++)
  93.                 {
  94.                         cout << out[i][j];
  95.                 }
  96.                 cout << endl;
  97.                 delete[] in[i];
  98.                 delete[] out[i];
  99.         }
  100.         return 0;
  101. }

  102. bool itrans()
  103. {
  104.         char c;
  105.         cin >> c;
  106.         switch(c)
  107.         {
  108.         case '*':
  109.                 return 1;
  110.         case '?':
  111.                 return 0;
  112.         }
  113. }
复制代码
优化题解
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. bool a[105][105];//一张地图,有雷为一,无雷为零
  4. int main()
  5. {
  6.     memset(a,0,sizeof(a));//地图最开始清空
  7.     int n,m;
  8.     char tmp;
  9.     cin>>n>>m;
  10.     for(int i=1;i<=n;i++)//读入地图
  11.     {
  12.         for(int j=1;j<=m;j++)
  13.         {
  14.             cin>>tmp;//读入每一个点
  15.             if(tmp=='*') a[i][j]=1;//如果是地雷就将这个点设为一
  16.         }
  17.     }
  18.     for(int i=1;i<=n;i++)
  19.     {
  20.         for(int j=1;j<=m;j++)
  21.         {
  22.             if(a[i][j]==1) printf("*"); //如果是地雷不用输出数字
  23.             else
  24.             {
  25.                 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]);
  26.                 //将旁边的雷加起来输出
  27.             }
  28.         }
  29.         printf("\n");
  30.     }
  31.     return 0;//愉快的结束了主程序
  32. }
复制代码
THE END











wenlonglong
MCBBS有你更精彩~