UVA 532 - Dungeon Master

不难, 图的BFS。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <queue>
#include <utility>
#include <tuple>
#include <algorithm>

using namespace std;

const int size = 30 + 10;

char s[size][size][size];
int  v[size][size][size];

int d[][3] = { {0 , 0 , -1} , {0 , 0 , 1} , {0 , -1 , 0} , {0 , 1 , 0} ,
			   {1 , 0 , 0} , {-1 , 0 , 0}};
int main()
{
	int h , r , c;
	while(cin >> h >> r >> c && h && r && c)
	{
		memset(s , 0 , sizeof(s));
		memset(v , -1 , sizeof(v));
		for(int i = 0 ; i < h ; ++i)
		{
			for(int j = 0 ; j < r ; ++j)
			{
				cin >> s[i][j];
			}
		}
		
		auto start = find(p , (p + sizeof(s)) , 'S');
		auto finish = find(p , (p + sizeof(s)) , 'E');
		
		*start = *finish = '.';
		
		int a[3] , b[3];
		char *p = (char*)s;
		a[0] = (start - p) / size / size;
		a[1] = ((start - p) - a[0] * size * size) / size;
		a[2] = (start - p) % size;
		b[0] = (finish - p) / size / size;
		b[1] = ((finish - p) - b[0] * size * size) / size;
		b[2] = (finish - p) % size;
		
		int z , x , y;
		queue< tuple<int , int , int> > q;
		v[a[0]][a[1]][a[2]] = 0;
		q.push(make_tuple(a[0] , a[1] , a[2]));
		while ( !q.empty() )
		{
			z = get<0>(q.front());
			x = get<1>(q.front());
			y = get<2>(q.front());
			
			if(z == b[0] && x == b[1] && y == b[2]) break;
			
			q.pop();
			
			for(int i = 0 ; i < 6 ; ++i)
			{
				int tz = z + d[i][0];
				int tx = x + d[i][1];
				int ty = y + d[i][2];

				if(tz < 0 || tz >= h) continue;
				if(tx < 0 || tx >= r) continue;
				if(ty < 0 || ty >= c) continue;
				if(s[tz][tx][ty] == '#' || v[tz][tx][ty] >= 0) continue;
				
				v[tz][tx][ty] = v[z][x][y] + 1;
				q.push(make_tuple(tz , tx , ty));
			}
		}
		
		if(q.empty()) cout << "Trapped!" << endl;
		else cout << "Escaped in "<< v[z][x][y]<< " minute(s)." << endl;
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值