还是水题一道,一直做水题也没意思,于是就不按UVa的题号顺序做了。按部就班地按照《挑战编程-程序设计竞赛训练手册》里的顺序做下去好了,第一章的练习仍然很水。今天UVa抽风了,一直重定向,下面的代码没提交过。
Q10189: Minesweeper
你应该有玩过windows里的一个小游戏叫做"挖地雷"。这个游戏的目的就是要在M*N的地雷区格子中找出所有的地雷。为了要帮助你,这个游戏会在非地雷的格子上有些数字,告诉你这一个格子的邻居共有多少个地雷。例如:以下4*4的格子中有2个地雷(以*表示)
*... .... .*.. ....
假如我们用上面提到的数字来表现的话可以得到下面的情况:
*100 2210 1*10 1110
可以很简单的看出,每一个格子最多有8个邻居。
Input
每组测试资料的第一列有2个整数 n,m( 0 < n,m <= 100)。分別代表地雷区的宽和长。接下来的n列,每列有m个字元代表地雷区。地雷以 * 表示,非地雷以 . 表示。
当n=m=0代表输入结束。
Output
对每一个地雷区,首先输出一列:
Field #x:
x代表这是第几组测试地雷区。接下来的n列表示出以数字取代 . 的地雷区。
测试地雷区之间请空一列。请参考sample output.
Sample input
4 4 *... .... .*.. .... 3 5 **... ..... .*... 0 0
Sample Output
Field #1: *100 2210 1*10 1110 Field #2: **100 33200 1*100
简体中文由Lucky貓的 UVA(ACM)園地转换。
还是水题一道。

#ifndef ONLINE_JUDGE
#pragma warning(disable : 4996)
#endif
#include <iostream>
using namespace std;
#define MAX 100
int width, height;
char map[MAX][MAX];
int value[MAX][MAX];
void solve()
{
for (int i = 0; i < height; ++i)
{
for (int j = 0; j < width; ++j)
{
if (map[j][i] == '*')
{
if (j - 1 >= 0)
{
if (i - 1 >= 0)
{
++value[j - 1][i - 1];
}
++value[j - 1][i];
if (i + 1 < height)
{
++value[j - 1][i + 1];
}
}
if (i - 1 >= 0)
{
++value[j][i - 1];
}
if (i + 1 < height)
{
++value[j][i + 1];
}
if (j + 1 < width)
{
if (i - 1 >= 0)
{
++value[j + 1][i - 1];
}
++value[j + 1][i];
if (i + 1 < height)
{
++value[j + 1][i + 1];
}
}
}
}
}
}
///////////////////////////SubMain//////////////////////////////////
int main(int argc, char *argv[])
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
int n = 0;
while (cin >> height >> width)
{
if (height == 0 && width == 0)
{
break;
}
memset(map, 0, sizeof(map));
memset(value, 0, sizeof(value));
++n;
for (int i = 0; i < height; ++i)
{
for (int j = 0; j < width; ++j)
{
cin >> map[j][i];
}
}
solve();
cout << "Field #" << n << ':' << endl;
for (int i = 0; i < height; ++i)
{
for (int j = 0; j < width; ++j)
{
if (map[j][i] != '*')
{
cout << value[j][i];
}
else
{
cout << '*';
}
}
cout << endl;
}
cout << endl;
}
#ifndef ONLINE_JUDGE
fclose(stdin);
fclose(stdout);
system("out.txt");
#endif
return 0;
}
///////////////////////////End Sub//////////////////////////////////
码农场