解题思路:
这个题的关键在于弄懂题目,知道题目问的是啥,其实翻译一遍可知道,该题目就是根据扫雷游戏的规则,给定最后的雷和安全区位置,填充信息场。 思路呢? 首先确定好输入,我弄了两个数组,都是存雷的信息,一个填充信息的时候计算周围八个格雷的个数用,另一个输出用。
关键点: 计算周围八个格雷的个数
遍历一遍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语言程序设计教程(第三版)课后习题10.2 (C语言代码)浏览:669 |
不知道哪里错了浏览:1141 |
震宇大神的杀毒软件 (C++代码)浏览:1110 |
矩形面积交 (Java代码)浏览:1213 |
回文串 (C语言代码)浏览:2846 |
Pascal三角 (C语言代码)格式错误浏览:516 |
【出圈】 (C语言代码)浏览:794 |
【简单计算】 (C语言代码)浏览:622 |
【明明的随机数】 (C语言代码)浏览:785 |
1017题解浏览:583 |