放牧代码和思想
专注自然语言处理、机器学习算法
    恕不接待索要源码语料者、索求技术方案者、以及不Google的懒人。

UVa Q10189: Minesweeper

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

知识共享许可协议 知识共享署名-非商业性使用-相同方式共享码农场 » UVa Q10189: Minesweeper

分享到:更多 ()

评论 欢迎留言

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

我的开源项目

HanLP自然语言处理包基于DoubleArrayTrie的Aho Corasick自动机