UVA 10047 独轮车

BFS搜索,重点提到了STL优先队列 priority_queue的运用以及写法

参考http://www.cnblogs.com/penseur/archive/2011/02/26/1965550.html

#include<iostream>
#include<cstdio>
#include<cstring>
#include<memory>
#include<queue>
#include<algorithm>
#include<string>
#include<cmath>
using namespace std;

///
#define Maxn 30

char maze[Maxn][Maxn];
int M, N;
int dir[4][2] = { {-1, 0}, {0, -1}, {1, 0}, {0, 1} };  
int mark[Maxn][Maxn][4][5];
struct node
{
    int x, y, step, color, dir;
    friend bool operator <(node a,node b)
    {
        return a.step>b.step;
    };  
};
node start, temp, later, target;
void bfs()
{
	int i, j;
	priority_queue<node> q;
	start.step = start.color = start.dir = 0;
	q.push(start);
	mark[start.y][start.x][0][0] = true;
	while (!q.empty())
	{
		temp = q.top();
		q.pop();
		for (i = 0; i < 4; i++)
		{
			if (temp.dir == i)
			{
				later.y = temp.y + dir[i][0];
				later.x = temp.x + dir[i][1];
				later.step = temp.step + 1;
				later.color = (temp.color + 1) % 5;
				later.dir = temp.dir;
			}
			else
			{
				later.y = temp.y;
				later.x = temp.x;
				if ((int)fabs(temp.dir - i) == 2)
					later.step = temp.step + 2;
				else 
					later.step = temp.step + 1;
				later.dir = i;
				later.color = temp.color;
			}
			if(!(later.x >=0 && later.x < N && later.y >= 0 && later.y < M && maze[later.y][later.x]!='#'))
				continue;
			if (!mark[later.y][later.x][later.dir][later.color])
			{
				if (later.y == target.y && later.x == target.x && later.color == 0)
				{
					cout<<"minimum time = "<<later.step<<" sec"<<endl;
                    return;
				}
				mark[later.y][later.x][later.dir][later.color] = true;
				q.push(later);
			}

		}

	}
	cout << "destination not reachable" << endl;
}

int main()
{
	///
	int i, j;
	int cases = 0;
	while (1)
	{
		cases++;
		cin >> M >> N;
		if (M == 0 || N == 0)
			break;
		if(cases != 1)
			cout<<endl;
		cout << "Case #" << cases << endl;
        memset(mark, false, sizeof(mark));

		for (i = 0; i < M; i++)
		{
			for (j = 0; j < N; j++)
			{
				cin >> maze[i][j];
				if (maze[i][j] == 'S')
				{
					start.y = i;
					start.x = j;
				}
				if (maze[i][j] == 'T')
				{
					target.y = i;
					target.x = j;
				}
			}
		}
		bfs();

	}



	///
    return 0;
}



 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值