zoj 1649 Rescue【bfs】

题目连接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=649

大致题意:求r到a最少用多长时间,走到‘.'的时间为1,走到‘x'的时间为2,’#‘不能走。

代码:

#include<stdio.h>
#include<string.h>
#include<limits.h>
#include<algorithm>
#include<queue>
using namespace std;

#define M 201

char map[M][M]; //存放地图。
int counts[M][M]; //存放从r到每个点的最小时间。
int n, m;
int dir[4][2] =
{
	{1, 0}, {0, 1}, {-1, 0}, {0, -1}
};

//该点横纵坐标。
struct node {
	int x, y;
};

void bfs(node post)
{
	queue<node> Q;
	Q.push(post);
	while( !Q.empty() ) {
		node tmp;
		tmp.x = Q.front().x;
		tmp.y = Q.front().y;
		Q.pop();
		for(int i = 0; i < 4; i++) {
			node next;
			next.x = tmp.x + dir[i][0];
			next.y = tmp.y + dir[i][1];
			if(next.x >= 0 && next.x < n && next.y >= 0 && next.y < m && map[next.x][next.y] != '#') {
				if(map[ next.x ][ next.y ] == '.' && counts[next.x][next.y] > counts[tmp.x][tmp.y]+1) {
					counts[next.x][next.y] = counts[tmp.x][tmp.y]+1;
					Q.push( next );
				} else if(map[ next.x ][ next.y ] == 'x' && counts[next.x][next.y] > counts[tmp.x][tmp.y]+2) {
					counts[next.x][next.y] = counts[tmp.x][tmp.y]+2;
					Q.push( next );
				} else if(map[ next.x ][ next.y ] == 'a') {
					counts[next.x][next.y] = min(counts[next.x][next.y], counts[tmp.x][tmp.y]+1);
				}
			}
		}
	}
}

int main()
{
	while(scanf("%d %d%*c", &n, &m) != EOF) {
		//初始化最大。
		for(int i = 0; i < n; i++) {
			for(int j = 0; j < m; j++) {
				counts[i][j] = INT_MAX;
			}
		}
		node post; //r点的坐标。
		int ai, aj; //目标点的坐标。
		for(int i = 0; i < n; i++) {
			for(int j = 0; j < m; j++) {
				scanf("%c", &map[i][j]);
				if(map[i][j] == 'r') {
					post.x = i;
					post.y = j;
				}
				if(map[i][j] == 'a') {
					ai = i;
					aj = j;
				}
			}
			scanf("%*c");
		}
		counts[post.x][post.y] = 0;
		bfs(post);
		if(counts[ai][aj] == INT_MAX) {
			printf("Poor ANGEL has to stay in the prison all his life.\n");
		} else {
			printf("%d\n", counts[ai][aj]);
		}
	}
	return 0;
}

  

posted @ 2012-11-04 17:32  小猴子、  阅读(246)  评论(0编辑  收藏  举报