解题思路:
这个题的关键在于弄懂题目,知道题目问的是啥,其实翻译一遍可知道,该题目就是根据扫雷游戏的规则,给定最后的雷和安全区位置,填充信息场。 思路呢? 首先确定好输入,我弄了两个数组,都是存雷的信息,一个填充信息的时候计算周围八个格雷的个数用,另一个输出用。
关键点: 计算周围八个格雷的个数
遍历一遍b数组,如果不是雷的地方就要填充,是雷就原样输出,填充周围八个格,有几个雷就填充几。
怎么统一操作都是遍历周围八个格呢? 那就是在存的时候给定信息的外部填充一圈安全的字符,也就是'.'
这样后面的操作就统一了。 也就是二维数组的长度,要比他给的行列多出两行两列。
注意事项:
思路明白之后,注意事项就是别越界。 还有最后的输出格式,之间没有空格。
参考代码:
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
//输入
int row, col;
int times = 0;
while (cin>>row>>col && row!=0 && col!=0)
{
times++;
char a[row+2][col+2];
char b[row+2][col+2]; //多出两行两列,填充。
memset(a,'.',sizeof(a));
memset(b,'.',sizeof(b));
for (int i=1; i<=row; i++)
{
for (int j=1; j<=col; j++)
{
cin >> a[i][j];
b[i][j] = a[i][j];
}
}
//遍历一遍b数组,如果不是雷的地方就要填充,是雷就原样输出,填充是周围8个格,有几个雷就填充几
cout << "Field #" << times << ":" << endl;
for (int i=1; i<=row; i++)
{
for (int j=1; j<=col; j++)
{
if (b[i][j]!='*')
{
int mine_num = 0;
//遍历周围的八个格
for (int m=i-1; m<=i+1; m++)
{
for (int n=j-1; n<=j+1; n++)
{
if (b[m][n]=='*')
{
mine_num++;
}
}
//cout << mine_num << endl;
}
a[i][j] = mine_num + '0';
}
}
}
for (int i=1; i<=row; i++)
{
for (int j=1; j<=col; j++)
cout << a[i][j];
cout << endl;
}
cout << endl;
}
return 0;
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复