本帖最后由 穆思成 于 2020-7-3 10:55 编辑
题目来源
https://www.luogu.com.cn/problem/P2670
题目描述
输入格式
输出格式
输入输出样例输入 #1
3 3
*??
???
?*?输出 #1
*10
221
1*1
输入 #22 3
?*?
*??
输出 #2
2*1
*21
说明/提示
复制代码复制代码
题目来源
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。
我的题解
- #include <iostream>
- using namespace std;
- bool itrans();
- int main()
- {
- int n, m, count = 0;
- cin >> n >> m;
- bool** in = new bool* [n];
- char** out = new char* [n];
- for (int i = 0; i < n; i++)
- {
- in[i] = new bool[m];
- out[i] = new char[m];
- for (int j = 0; j < m; j++)
- {
- in[i][j] = itrans();
- if (in[i][j] == 1)
- {
- out[i][j] = '*';
- }
- }
- }
- for (int i = 0; i < n; i++)
- {
- for (int j = 0; j < m; j++)
- {
- if (in[i][j] == 0)
- {
- if (i >= 1)
- {
- if (in[i - 1][j] == 1)
- {
- count++;
- }
- if (j >= 1)
- {
- if (in[i - 1][j - 1] == 1)
- {
- count++;
- }
- }
- if (j <= m - 2)
- {
- if (in[i - 1][j + 1] == 1)
- {
- count++;
- }
- }
- }
- if (i <= n - 2)
- {
- if (in[i + 1][j] == 1)
- {
- count++;
- }
- if (j >= 1)
- {
- if (in[i + 1][j - 1] == 1)
- {
- count++;
- }
- }
- if (j <= m - 2)
- {
- if (in[i + 1][j + 1] == 1)
- {
- count++;
- }
- }
- }
- if (j >= 1)
- {
- if (in[i][j - 1] == 1)
- {
- count++;
- }
- }
- if (j <= m - 2)
- {
- if (in[i][j + 1] == 1)
- {
- count++;
- }
- }
- out[i][j] = count + '0';
- count = 0;
- }
- }
- }
- for (int i = 0; i < n; i++)
- {
- for (int j = 0; j < m; j++)
- {
- cout << out[i][j];
- }
- cout << endl;
- delete[] in[i];
- delete[] out[i];
- }
- return 0;
- }
- bool itrans()
- {
- char c;
- cin >> c;
- switch(c)
- {
- case '*':
- return 1;
- case '?':
- return 0;
- }
- }
优化题解
- #include<bits/stdc++.h>
- using namespace std;
- bool a[105][105];//一张地图,有雷为一,无雷为零
- int main()
- {
- memset(a,0,sizeof(a));//地图最开始清空
- int n,m;
- char tmp;
- cin>>n>>m;
- for(int i=1;i<=n;i++)//读入地图
- {
- for(int j=1;j<=m;j++)
- {
- cin>>tmp;//读入每一个点
- if(tmp=='*') a[i][j]=1;//如果是地雷就将这个点设为一
- }
- }
- for(int i=1;i<=n;i++)
- {
- for(int j=1;j<=m;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]);
- //将旁边的雷加起来输出
- }
- }
- printf("\n");
- }
- return 0;//愉快的结束了主程序
- }
THE END
MCBBS有你更精彩~