hdu 1242 dfs/bfs
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.)
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.
本题需要注意的是,天使的朋友可能不只一个,所以,应该从天使的位置开始搜去找其朋友就ok了。
#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的更多相关文章
- HDU 4771 (DFS+BFS)
Problem Description Harry Potter has some precious. For example, his invisible robe, his wand and hi ...
- HDU 1242 Rescue(BFS+优先队列)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1242 题目描述: Problem Description Angel was caught by t ...
- HDU 1242 Rescue(BFS),ZOJ 1649
题目链接 ZOJ链接 Problem Description Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The ...
- hdu 1241(DFS/BFS)
Oil Deposits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- HDU 1242 dFS 找目标最短路
//多个起点,要最短得目标,不妨倒过来从目标出发,去找最近的点更新!!!!!!递归时思路要清楚 #include<iostream> #include<cstring> usi ...
- hdu 1242 Rescue (BFS)
Rescue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Subm ...
- hdu 1242 Rescue
题目链接:hdu 1242 这题也是迷宫类搜索,题意说的是 'a' 表示被拯救的人,'r' 表示搜救者(注意可能有多个),'.' 表示道路(耗费一单位时间通过),'#' 表示墙壁,'x' 代表警卫(耗 ...
- ID(dfs+bfs)-hdu-4127-Flood-it!
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4127 题目意思: 给n*n的方格,每个格子有一种颜色(0~5),每次可以选择一种颜色,使得和左上角相 ...
- DFS/BFS+思维 HDOJ 5325 Crazy Bobo
题目传送门 /* 题意:给一个树,节点上有权值,问最多能找出多少个点满足在树上是连通的并且按照权值排序后相邻的点 在树上的路径权值都小于这两个点 DFS/BFS+思维:按照权值的大小,从小的到大的连有 ...
随机推荐
- Linq 构造复杂Json 多表group by
一个主表A(a1,a2),子表B(a1,b1,b2) ,想得到的结果是 [{a1,a2,Info [{b1,b2},{b1,b2},...}]] var list= from a in A join ...
- WPF 启动初始界面
不经意间发现了wpf的这个小玩意,感觉蛮有意思的.我在项目中添加了一张图片 如图: wpf-1.JPG(10.73 K) 2010-6-6 17:04:47 然后再这张图片的属性中设置它的生成操作为S ...
- 初学者自学笔记-this的用法
请注意:这是自学者的笔记,只是个人理解,并非技术分享,如有错误请指正. "this"的意思,简单而言,就是"这个",也就是"当前".谁调用它 ...
- JS常用的7中跨域方式总结
javascript跨域有两种情况: 1.基于同一父域的子域之间,如:a.c.com和b.c.com 2.基于不同的父域之间,如:www.a.com和www.b.com 3.端口的不同,如:ww ...
- 《wc》-linux命令五分钟系列之十七
本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. ...
- JS中关于clientWidth offsetWidth srollWidth等的含义
网页可见区域宽: document.body.clientWidth;网页可见区域高: document.body.clientHeight;网页可见区域宽: document.body.offset ...
- Jquery Mobile下设置radio控件选中
问题: .html文件头部引入了: <script src="js/jquery.js"></script> <script src="js ...
- 【随记】SQL Server连接字符串参数说明
废话不多说,请参见 SqlConnection.ConnectionString .
- apache2.4配置虚拟主机
step1 启用 httpd-vhosts.conf 找到E:/apache/Apache24/conf 中httpd.conf 文件,取消注释下面这句话 step2 在 httpd-vhosts.c ...
- PHP substr截取中文字符出现乱码的问题解疑
我们在使用PHP substr截取中文字符的时候,经常会出现乱码的情况,导致程序无法正常运行,这时怎么引起的呢?通过分析,我们知道,主要是substr可能硬生生的将一个中文字符“锯”成两半.解决办法: ...