Problem Description
Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is described as a N * M (N, M <= 200) matrix. There are WALLs, ROADs, and GUARDs in the prison.

Angel's friends want to save Angel. Their task is: approach Angel. We assume that "approach Angel" is to get to the position where Angel stays. When there's a guard in the grid, we must kill him (or her?) to move into the grid. We assume that we moving up, down, right, left takes us 1 unit time, and killing a guard takes 1 unit time, too. And we are strong enough to kill all the guards.

You have to calculate the minimal time to approach Angel. (We can move only UP, DOWN, LEFT and RIGHT, to the neighbor grid within bound, of course.)

 
Input
First line contains two integers stand for N and M.

Then N lines follows, every line has M characters. "." stands for road, "a" stands for Angel, and "r" stands for each of Angel's friend.

Process to the end of the file.

 
Output
For each test case, your program should output a single integer, standing for the minimal time needed. If such a number does no exist, you should output a line containing "Poor ANGEL has to stay in the prison all his life." 
 
Sample Input
7 8
#.#####.
#.a#..r.
#..#x...
..#..#.#
#...##..
.#......
.......
.
 
Sample Output
13
 
题意:天使被困在监狱,他的朋友们想见他,监狱的地形复杂,包括路(用点标示),墙(用#标示),天使的位置(用a标示),他的朋友(用r标示),监狱里还有守卫(用x标示),他的朋友只能向左右上下四个方向走,走以不花一单位时间,若碰上守卫,消灭守卫需要额外花费一单位时间。问最少多长时间天使能见到他的朋友。

本题需要注意的是,天使的朋友可能不只一个,所以,应该从天使的位置开始搜去找其朋友就ok了。

 dfs做法
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <string>
#include <algorithm>
#include <math.h>
#include <cmath>
#include <map>
#include <set>
using namespace std;

#define Maxn 500

int hang,lie;
int end_x,end_y;
int begin_x,begin_y;
int maxn;
int q = 0;
bool flag = false;
char MAP[Maxn][Maxn];
int dir[4][2] = {
    {1,0},
    {-1,0},
    {0,1},
    {0,-1}
};

void print()
{
    for(int i = 0; i < hang; i++)
    {
        for(int j = 0; j < lie; j++)
        {
            printf("%c",MAP[i][j]);
        }
        printf("\n");
    }
}

void dfs(int x,int y,int Time)
{
    if (MAP[x][y] == 'r')
    {
        flag = true;
        if (Time < maxn)
        {
            maxn = Time;
        }
    }
    MAP[x][y] = '#';
    for(int i = 0; i < 4; i++)
    {
        int xx = x + dir[i][0];
        int yy = y + dir[i][1];
        if (xx >= 0 && xx < hang && yy >= 0 && yy < lie && MAP[xx][yy] != '#')
        {
            if (MAP[xx][yy] != '#')
            {
                if (MAP[xx][yy] == 'x')
                {
                    dfs(xx,yy,Time+2);
                    MAP[xx][yy] = 'x';
                }
                else if(MAP[xx][yy] == 'r')
                {
                    dfs(xx,yy,Time+1);
                    MAP[xx][yy] = 'r';
                }
                else
                {
                    dfs(xx,yy,Time+1);
                    MAP[xx][yy] = '.';
                }
            }
        }
    }
}

int main()
{
    while(cin >> hang >> lie)
    {
        maxn = 214748364;
        flag=false;
        for (int i = 0; i < hang; i++)
        {
            scanf("%s",MAP[i]);
        }
        for(int i = 0; i < hang; i++)
        {
            for(int j = 0; j < lie; j++)
            {
                // printf("%c",MAP[i][j]);
                if (MAP[i][j] == 'a')
                {
                    begin_x = i;
                    begin_y = j;
                    MAP[i][j] = '#';
                }
            }
        }
        dfs(begin_x,begin_y,0);
        if (flag)
        {
            printf("%d\n",maxn);
        }
        else
        {
            printf("Poor ANGEL has to stay in the prison all his life.\n");
        }
    }
}

接下来是bfs做法,记得要标记,要不然就死循环了

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

#define Maxn 1000

struct Node
{
	int x;
	int y;
	int step;
};

char MAP[Maxn][Maxn];
int begin_x,begin_y;
int hang,lie;
bool flag;
int maxn;
bool visit[Maxn][Maxn];
int dir[4][2] = {
	{0,1},
	{0,-1},
	{1,0},
	{-1,0}
};

void bfs(int x,int y)
{
	memset(visit,false,sizeof(visit));
	queue <Node> q;
	Node a,b,c;
	a.x = x;
	a.y = y;
	visit[x][y] = true;
	a.step = 0;
	q.push(a);
	while(!q.empty())
	{
		b = q.front();
		q.pop();
		if (MAP[b.x][b.y] == 'r')
		{
			if (maxn > b.step)
			{
				maxn = b.step;
			}
			flag = true;
		}
		for(int i = 0; i < 4; i++)
		{
			c.x = b.x + dir[i][0];
			c.y = b.y + dir[i][1];
			if (c.x >= 0 && c.x < hang && c.y >= 0 && c.y < lie && MAP[c.x][c.y] != '#' && !visit[c.x][c.y])
			{
				visit[b.x][b.y] = true;
				if (MAP[c.x][c.y] == 'x')
				{
					c.step = b.step + 2;
				}
				else
				{
					c.step = b.step + 1;
				}
				q.push(c);
			}
		}
	}
}

int main()
{
    while(scanf("%d%d",&hang,&lie)!=EOF&&(hang+lie))
    {
		flag = false;
		maxn = 2147483646;
		for(int i = 0; i < hang; i++)
		{
			scanf("%s",MAP[i]);
		}
		for(int i = 0; i < hang; i++)
		{
			for(int j = 0; j < lie; j++)
			{
				if (MAP[i][j] == 'a')
				{
					begin_x = i;
					begin_y = j;
				}
			}
		}
		bfs(begin_x,begin_y);
		if (flag)
		{
			printf("%d\n",maxn);
		}
		else
		{
			printf("Poor ANGEL has to stay in the prison all his life.\n");
		}
    }
}

  

  

hdu 1242 dfs/bfs的更多相关文章

  1. HDU 4771 (DFS+BFS)

    Problem Description Harry Potter has some precious. For example, his invisible robe, his wand and hi ...

  2. HDU 1242 Rescue(BFS+优先队列)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1242 题目描述: Problem Description Angel was caught by t ...

  3. HDU 1242 Rescue(BFS),ZOJ 1649

    题目链接 ZOJ链接 Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The ...

  4. hdu 1241(DFS/BFS)

    Oil Deposits Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  5. HDU 1242 dFS 找目标最短路

    //多个起点,要最短得目标,不妨倒过来从目标出发,去找最近的点更新!!!!!!递归时思路要清楚 #include<iostream> #include<cstring> usi ...

  6. hdu 1242 Rescue (BFS)

    Rescue Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  7. hdu 1242 Rescue

    题目链接:hdu 1242 这题也是迷宫类搜索,题意说的是 'a' 表示被拯救的人,'r' 表示搜救者(注意可能有多个),'.' 表示道路(耗费一单位时间通过),'#' 表示墙壁,'x' 代表警卫(耗 ...

  8. ID(dfs+bfs)-hdu-4127-Flood-it!

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4127 题目意思: 给n*n的方格,每个格子有一种颜色(0~5),每次可以选择一种颜色,使得和左上角相 ...

  9. DFS/BFS+思维 HDOJ 5325 Crazy Bobo

    题目传送门 /* 题意:给一个树,节点上有权值,问最多能找出多少个点满足在树上是连通的并且按照权值排序后相邻的点 在树上的路径权值都小于这两个点 DFS/BFS+思维:按照权值的大小,从小的到大的连有 ...

随机推荐

  1. 也谈Excel导出

    吐槽 Excel导出在天朝的软件大环境下,差点成为软件开发必备.俺就遇到过,所有报表不提供导出功能,就能不验收的囧事.报表能查看能打印能形成图表已经完美,实在搞不懂导出excel有个毛用,但是公司依靠 ...

  2. linux安装python使用的MySQLdb

    安装mysqldb模块需已安装mysql 使用pip安装MySQLdb pip install mysql-python mac os安装mysqldb sudo pip install mysql- ...

  3. 批处理协同blat自动发邮件

    Blat - A Windows (32 & 64 bit) command line SMTP mailer. Use it to automatically eMail logs, the ...

  4. Hibernate中的一对多关系详解(2)

    一对多的关系:例如,部门对员工,一个部门可以有多个员工 多对一的关系:例如,员工对部门,多个员工属于一个部门,并且每个员工只能属于一个部门 那么一对多.多对一在数据库中的是怎样表示的呢?好多话都不说了 ...

  5. Phonegap 3.0 获取当前地址位置

    新版本的cordova 3.0 中,使用官方的示例可直接获取当前手机的地理位置,前提是手机开启了gps,或可联网. 获取到的是经纬度坐标值等信息,可通过google api 实现通过经纬度获取当前地理 ...

  6. IndexedDB demo showcase

    var dbGlobals = new Object(); dbGlobals.db = null; dbGlobals.description = "This database is us ...

  7. PHP 如何安全的使用 MySQL ?

    大多数 PHP 程序员对 MySQL 肯定不陌生,至于各种 MySQL 函数的用法在开发手册和 w3school 这类网站上也有很多介绍.但是,你所用的写法真的安全吗?面对越来越猖獗的黑客攻击,SQL ...

  8. Spring REST

    前面介绍过Spring的MVC结合不同的view显示不同的数据,如:结合json的 view显示json.结合xml的view显示xml文档.那么这些数据除了在WebBrowser中用JavaScri ...

  9. 又拍云——图像处理师(GraphicsMagick、ImageMagick、FFmpeg)

    云处理平台开发工程师 工作地:杭州 岗位职责:负责云处理平台研发工作: 岗位要求: 扎实的 C 语言编程基础及算法优化能力: 至少能够熟练使用一门脚本语言(Python.Ruby.Lua 等)进行日常 ...

  10. wcf资料

    WCF服务安全控制之netTcpBinding的用户名密码验证http://www.cnblogs.com/wengyuli/archive/2011/05/14/wcf-nettcpbinding- ...