hdu 1983(BFS+DFS) 怪盗Kid

http://acm.hdu.edu.cn/showproblem.php?pid=1983

首先,题目要求出口和入口不能封闭,那么,只要把出口或入口的周围全给封闭了那盗贼肯定无法成功偷盗,出口或入口周围最多

会有四个点,所以初始答案ans=4(没必要计算出出口或入口可以封闭的最小值,就初始为4就好),然后从一到四枚举看有没有

最小的符合条件的值,

所以先用BFS查找出至少偷到一个宝石的最小时间的路径,记录下来,然后枚举封闭路径上的点递归回去,再BFS判断是否能偷盗

成功---DFS中插入BFS

code

 1 #include<cstdio>
 2 #include<queue>
 3 #include<cstring>
 4 using namespace std;
 5 struct point{
 6      int x,y;
 7      int time,flag;//记录时间和是否至少偷到一个宝石
 8      int rx[65],ry[65];//记录路径
 9 };
10 char map[10][10];
11 int visit[10][10][2];//开三维的数组时因为有偷到了和还没有偷到两种情况,作用相当于是当偷到第一个宝石后,再议这个宝石的地方为起点寻找到终点的时间最短路径,确保了是最短的
12 int n,m,sx,sy,tt,ans;
13 int dx[]={1,-1,0,0};
14 int dy[]={0,0,1,-1};
15 void DFS(int deep)
16 {
17     int i,k;
18     if (deep>ans) return ;
19     memset(visit,0,sizeof(visit));
20     queue<point>Q;
21     point now,next;
22     now.x=sx,now.y=sy;
23     now.time=now.flag=0;
24     visit[now.x][now.y][now.flag]=1;
25     Q.push(now);
26     int minn=-1;
27     while (!Q.empty())
28     {
29         now=Q.front();
30         Q.pop();
31         if (map[now.x][now.y]==‘E‘&&now.flag==1)
32         {
33             minn=now.time;
34             break;
35         }
36         for (i=0;i<4;i++)
37         {
38             next.x=now.x+dx[i];
39             next.y=now.y+dy[i];
40             if (next.x<1||next.x>n||next.y<1||next.y>m)continue;
41             if (map[next.x][next.y]==‘#‘)continue;
42             if (now.time>=tt)continue;
43             if (map[next.x][next.y]==‘J‘)  next.flag=1;
44             else next.flag=now.flag;
45             if (visit[next.x][next.y][next.flag]==1)continue;
46             for (k=1;k<=now.time;k++) //记录路径
47             {
48                 next.rx[k]=now.rx[k];
49                 next.ry[k]=now.ry[k];
50             }
51             next.time=now.time+1;
52             visit[next.x][next.y][next.flag]=1;
53             next.rx[next.time]=next.x;
54             next.ry[next.time]=next.y;
55             Q.push(next);
56         }
57     }
58     if (minn==-1)
59     {
60         if (deep<ans)
61             ans=deep;
62         return ;
63     }
64     for (i=1;i<=now.time;i++)
65     {
66         char op=map[now.rx[i]][now.ry[i]];
67         if (op==‘E‘||op==‘S‘) continue;
68         map[now.rx[i]][now.ry[i]]=‘#‘;
69         DFS(deep+1);
70         map[now.rx[i]][now.ry[i]]=op;//回溯
71     }
72 }
73 int main()
74 {
75     int t,i,j;
76     while (~scanf("%d",&t))
77     {
78         while (t--)
79         {
80             getchar();
81             scanf("%d %d %d",&n,&m,&tt);
82             for (i=1;i<=n;i++)
83             {
84                 for (j=1;j<=m;j++)
85                 {
86                     scanf(" %c",&map[i][j]);
87                     if (map[i][j]==‘S‘)
88                         sx=i,sy=j;
89                 }
90             }
91             ans=4;
92             DFS(0);
93             printf("%d\n",ans);
94         }
95     }
96     return 0;
97 }
时间: 2024-10-13 11:20:39

hdu 1983(BFS+DFS) 怪盗Kid的相关文章

HDU 1983 BFS&amp;&amp;DFS

最多只需要封锁4个区域即可,DFS封锁的区域,BFS是否可通过 #include "stdio.h" #include "string.h" #include "queue" using namespace std; int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; int s_x,s_y,n,m,t; char str[11][11]; struct node { int x,y,step,key; }; i

HDU 1983 BFS&amp;amp;&amp;amp;DFS

大多数刚需封锁4区域可以,DFS地区封锁.BFS无论是通过 #include "stdio.h" #include "string.h" #include "queue" using namespace std; int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; int s_x,s_y,n,m,t; char str[11][11]; struct node { int x,y,step,key; }; int

hdu 1044 bfs+dfs

//方便以后回顾错误//http://acm.hdu.edu.cn/showproblem.php?pid=1044//题意 给定起点.终点和图上的宝藏的权值,问 在规定的步数内能否从起点走到终点:若能走到,可携带宝藏的总价值最大是多少 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<queue> 5 #include<vector> 6 using n

hdu 1044(bfs+dfs+剪枝)

Collect More Jewels Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6739    Accepted Submission(s): 1564 Problem Description It is written in the Book of The Lady: After the Creation, the cruel

hdu 4771 Stealing Harry Potter&#39;s Precious (2013亚洲区杭州现场赛)(搜索 bfs + dfs) 带权值的路径

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4771 题目意思:'@'  表示的是起点,'#' 表示的是障碍物不能通过,'.'  表示的是路能通过的: 目的:让你从 '@' 点出发,然后每个点只能走一次,求出最小的距离: 解题思路:先用 bfs 求解出任意两点之间的距离,用 ans[i][j],表示点 i 到点  j 的距离: 然后用 dfs 递归求出从起点经过所有点的距离中,比较出最小的: AC代码: 1 #include<iostream>

HDU 1254 (经典游戏)推箱子 BFS+dfs

Problem Description 推箱子是一个很经典的游戏.今天我们来玩一个简单版本.在一个M*N的房间里有一个箱子和一个搬运工,搬运工的工作就是把箱子推到指定的位置,注意,搬运工只能推箱子而不能拉箱子,因此如果箱子被推到一个角上(如图2)那么箱子就不能再被移动了,如果箱子被推到一面墙上,那么箱子只能沿着墙移动. 现在给定房间的结构,箱子的位置,搬运工的位置和箱子要被推去的位置,请你计算出搬运工至少要推动箱子多少格. Input 输入数据的第一行是一个整数T(1<=T<=20),代表测试

HDU 4771 Stealing Harry Potter&#39;s Precious(BFS + DFS)

HDU 4771 Stealing Harry Potter's Precious 题目链接 题意:给定人的起始位置和k个宝物,求人拿完全部宝物最小的步数 思路:先bfs打出两两之间路径,然后dfs暴力求答案,因为宝物才4个,所以暴力是没问题的 代码: #include <stdio.h> #include <string.h> #include <queue> #include <algorithm> using namespace std; const

PKU 1562/HDU 1241 Oil Deposits(原油有多少块区域---BFS,DFS)

Oil Deposits Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSurvComp works with one large rectangular region o

HDU ACM 1044 Collect More Jewels BFS+DFS

题意:在一个迷宫中,有一些宝物,从起点走到终点,问在给定的时间内,到达终点后所能拾取珠宝的最大价值. 分析(BFS+DFS): 1.求入口到第一个取宝物的地方的最短距离 2.求第i个取宝物的地方到第i+1个取宝物的地方的最短距离 3.求第n个取宝物的地方到出口的最短距离 4.保证以上3点能在时间L内实现的情况下,取得的宝石价值最大. BFS特点:对于解决最短或最少问题特别有效,而且寻找深度小,但缺点是内存耗费量大(需要开大量的数组单元来存储状态) DFS特点:对于解决遍历和求所有问题有效,对于问