还是水题一道,一直做水题也没意思,于是就不按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//////////////////////////////////