解题思路:
首先利用指针数组和new建立二维动态数组存放数据
然后建立一个二维数组,这个二维数组的长度与宽度均比所需的二维数组大2
若我们输入4 4,那么程序会生成6*6的空间,用6*6的空间中最中央的4*4存放我们输入的符号,其余边上的内存均赋值为‘.’
这样在计算一个位置周围8个未知的地雷数是就不必考虑越界问题
如图
若输入* . . . 则生成 . . . . . .
. . . . . * . . . .
. * . . . . . . . .
. . . . . . * . . .
. . . . . .
注意事项:
题目翻译
你玩过扫雷游戏吗?这个可爱的小游戏带有一个特定的操作系统,我们不记得它的名字了。游戏的目标是找到mxn区域内所有地雷的位置。游戏会在一个方块中显示一个数字,告诉你有多少地雷与这个方块相邻。
每个方块最多有8个相邻方块。左边的4 x 4字段包含两个地雷,每个地雷用一个“*”字符表示。如果我们用上面描述的提示数字表示相同的字段,我们最终会得到右边的字段:....
……
*……1100 210 1*10 1110
e
输入
将由任意数量的字段组成。每个字段的第一行包含两个整数n和m (0 <n, ms \le$ 100),分别表示该字段的行数和列数。接下来的n行每一行都包含m个字符,代表这个字段。安全方块用"。"表示,我的方块用" * "表示,都不带引号。第一个字段行n = m = 0表示输入的结束,不应该被处理
输出
对于每个字段,只在一行中打印消息字段#x:,其中x代表从1开始的字段编号。接下来的n行应该包含带有。"字符的字段,替换为与该广场相邻的地雷的数量。字段输出之间必须有一个空行
参考代码:
#include <iostream>
using namespace std;
int main()
{
int n, m, i, j, count,f1,f2,flag=1;
char** p=NULL; %建立指向char型指针数组的指针
while (cin >> m >> n && m != 0)
{
p = new char* [m+2]; %建立char型数组
for (i = 0; i < m+2; i++)
p[i] = new char[n+2];
for (i = 0; i < m + 2; i++)
for (j = 0; j < n + 2; j++)
p[i][j] = '.'; %为边上的位置赋值‘.’
for (i = 1; i < m+1; i++)
{
for (j = 1; j < n+1; j++)
cin >> p[i][j]; %输入所需要的输入的符号
}
cout << "Field #" << flag++ << ":" << endl;
for (i = 1; i < m+1; i++)
{
for (j = 1; j < n+1; j++)
{
count = 0;
if (p[i][j] == '*') %检查 若为地雷则输出*
cout << '*';
else
{
for(f1=i-1;f1<=i+1;f1++)
for (f2 = j - 1; f2 <= j + 1; f2++)
{
if (p[f1][f2] == '*')
count++; %检查 若旁边有地雷则加一
}
cout << count;
}
}
cout << endl;
}
cout << endl;
delete[m + 2]p; %释放内存
}
return 0;
}
0.0分
2 人评分
模拟计算器 (C语言代码)浏览:966 |
妹子杀手的故事 (C语言代码)浏览:737 |
简单的a+b (C语言代码)浏览:594 |
简单的a+b (C++语言代码)浏览:895 |
拆分位数 (C语言代码)浏览:1361 |
求组合数 (C语言代码)浏览:1206 |
剪刀石头布 (C语言代码)浏览:802 |
A+B for Input-Output Practice (IV) (C语言代码)浏览:513 |
简单的a+b (C语言代码)浏览:1024 |
C语言程序设计教程(第三版)课后习题7.5 (C语言代码)浏览:727 |