nyoj 82

  题目:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=82

  2018-06-23 23:44:05 p.s.自己省错题了:

描述

一个叫ACM的寻宝者找到了一个藏宝图,它根据藏宝图找到了一个迷宫,这是一个很特别的迷宫,迷宫里有N个编过号的门(N<=5),它们分别被编号为A,B,C,D,E.为了找到宝藏,ACM必须打开门,但是,开门之前必须在迷宫里找到这个打开这个门所需的所有钥匙(每个门都至少有一把钥匙),例如:现在A门有三把钥匙,ACM就必须找全三把钥匙才能打开A门。现在请你编写一个程序来告诉ACM,他能不能顺利的得到宝藏。

  这里重点是开门前必须找到所有这个门对应的钥匙 orz。。。


   目前难点在于,这样的情况:

4 7
S.Aa.X.
a.Xc.C.
b.X..DG
.cB..Xd

  该数据太恶心...一时半会儿没想到办法。

  2018-06-28 17:51:14 p.s.今天看了又去一下昨天的结果,已显示该题AC了。

  思路:记录迷宫中所有钥匙分别有多少,判断是否集齐该门对应的所有钥匙,如果没有集齐则将前一个位置记录到队列中。

  2018-06-27 11:00:59 p.s.终于写出来了,这下应该对了,测试数据:

$ ./test
4 7
S.Aa.X.
a.Xc.C.
b.X..DG
.cB..Xd
YES
X X A X X X . 
X X X X X C X 
X X X X X D G 
X X B X X X d 
3 6
SbAdX.
a.BD.G 
cBCdaX
YES
X X A X X . 
X X B D X G 
X B C X X X 
4 4
S.X.
a.X.
..XG
....
YES
X X X . 
X X X . 
X X X G 
X X X X 
3 4
S.Xa
.aXB
b.AG
NO
X X X a 
X X X B 
X X A G

  但oj上显示结果是:判题中...?!这是什么鬼 > < #(貌似是服务端内部错误。。。。

  代码:

#include <bits/stdc++.h>
using namespace std;
struct ss
{
	int i, j;
	ss() {}
	ss(int x, int y) : i(x), j(y) {}
	void startpoint(int x, int y) { i = x, j = y; }
};
#define Index(c) ((c) - 'a')
int key[5], dir[4][2] = { 1, 0, -1, 0, 0, 1, 0, -1 };
int a, b, c, d, e;
bool bfs(vector<vector<char> > & maze, ss ps)
{
	memset(key, 0, sizeof(key));
	queue<ss> q, door;
	q.push(ps);
	maze[ps.i][ps.j] = 'X';
	while(!q.empty())
	{
		ps = q.front();
		q.pop();
		for (int i = 0; i < 4; i++)
		{
			ss n(ps.i + dir[i][0], ps.j + dir[i][1]);
			char ch = 0;
			if (n.i > -1 && n.i < maze.size() && n.j > -1 && n.j < maze[0].size())
			{
				if (maze[n.i][n.j] == 'G')
					return true;
				ch = maze[n.i][n.j];
				if (ch != 'X')
				{
					switch(ch)
					{
					case 'A': if (key[0] == a) q.push(n);
						    else door.push(ps); break;
					case 'B': if (key[1] == b) q.push(n);
						    else door.push(ps); break;
					case 'C': if (key[2] == c) q.push(n);
						    else door.push(ps); break;
					case 'D': if (key[3] == d) q.push(n);
						    else door.push(ps); break;
					case 'E': if (key[4] == e) q.push(n);
						    else door.push(ps); break;
					}
					if (ch == '.')
					{
						q.push(n);
						maze[n.i][n.j] = 'X';
					}
					else if (ch == 'a' || ch == 'b' || ch == 'c' || ch == 'd' || ch == 'e')
					{
						key[Index(ch)]++;
						while(!door.empty())
						{
							q.push(door.front());
							door.pop();
						}
						q.push(n);
						maze[n.i][n.j] = 'X';
					}
				}
			}
		}
	}
	return false;
}
int main()
{
	int i, j;
	
	while(1)
	{
		a = 0, b = 0, c = 0, d = 0, e = 0;
		ss ps;
		cin >> i >> j;
		if (i == 0 && j == 0)
			break;
		vector<vector<char> > maze(i, vector<char>(j));
		for (int i = 0; i < maze.size(); i++)
			for( int j = 0; j < maze[0].size(); j++)
			{
				cin >> maze[i][j];
				switch(maze[i][j])
				{
				case 'S': ps.startpoint(i, j); break;
				case 'a': a++; break;
				case 'b': b++; break;
				case 'c': c++; break;
				case 'd': d++; break;
				case 'e': e++; break;
				}
			}
		if (bfs(maze, ps))
			cout << "YES" << endl;
		else
			cout << "NO" << endl;
		/*
		for (int i = 0; i < maze.size(); i++)
		{
			for( int j = 0; j < maze[0].size(); j++)
				cout << maze[i][j] << ' ';
			cout << endl;
		}
		*/
	}
	return 0;
}

  

  

转载于:https://www.cnblogs.com/darkchii/p/9215922.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值