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 namespace std;
  7
  8 const int dx[] = {-1, 1, 0, 0};
  9 const int dy[] = { 0, 0,-1, 1};
 10
 11 int n, m, time, p;// 1<=n,m<=50 1<=l<=1000000  1<=p<=10
 12 char G[55][55];// 图
 13 int vis[55][55];
 14 int dis[15][15];// 两个点之间的距离(编号)
 15 int bin[15];// 存宝藏的价值
 16
 17 typedef pair<int, int> Pair;
 18 vector<Pair > v;// 存起点、终点和宝藏的坐标
 19 int len;// v的大小
 20
 21 struct node {
 22     int x, y, step;
 23     node(int x,int y,int step):x(x),y(y),step(step){}
 24 };
 25
 26 bool can_go(node b) {
 27     if(b.x < 0 || b.x >= n || b.y < 0 || b.y >= m || G[b.x][b.y] == ‘*‘ || vis[b.x][b.y]) return false;
 28     return true;
 29 }
 30
 31 void bfs(int s, int e) {
 32     dis[s][e] = dis[e][s] = 1000005;/* 这一步没加,改了半个下午bug。因为可能s达不到e 所以要先赋值为最大步长,这里bfs不是返回距离,以前都是返回距离或者bool,换个写法没考虑到这细节。。。*/
 33     memset(vis, 0, sizeof(vis));
 34     node a(v[s].first, v[s].second, 0);
 35     vis[v[s].first][v[s].second] = 1;
 36     queue<node> q;
 37     q.push(a);
 38     while(!q.empty()) {
 39         a = q.front();
 40         q.pop();
 41         if(a.x == v[e].first && a.y == v[e].second) {
 42             dis[s][e] = dis[e][s] = a.step;
 43             break;
 44         }
 45         for(int i = 0; i != 4; ++i) {
 46             node b(a.x+dx[i], a.y+dy[i], a.step+1);
 47             if(can_go(b)) {
 48                 q.push(b);
 49                 vis[b.x][b.y] = 1;
 50             }
 51         }
 52     }
 53 }
 54
 55 int maxn;
 56 int all_value;
 57 int vis2[15];
 58 void dfs(int cur, int step, int sum) {
 59     if(step > time) return;
 60     if(maxn == all_value) return;//剪枝 所有宝藏都找到了。。。
 61     if(cur == len-1) {
 62         //printf("-----\n");
 63         if(sum > maxn) maxn = sum;
 64         return;
 65     }
 66     for(int i = 0; i != len; ++i) {
 67         if(!vis2[i] && cur != i) {
 68             //printf("----\n");
 69             vis2[i] = 1;
 70             dfs(i, step+dis[cur][i], sum+bin[i]);
 71             vis2[i] = 0;
 72         }
 73     }
 74 }
 75
 76 int main() {
 77     int T, cnt = 0;
 78     scanf("%d", &T);
 79     while(T--) {
 80         scanf("%d%d%d%d", &m, &n, &time, &p);
 81         memset(bin, 0, sizeof(bin));
 82         all_value = 0;
 83         for(int i = 1; i <= p; ++i) {
 84             scanf("%d", &bin[i]);
 85             all_value += bin[i];
 86         }
 87         bin[0] = bin[p+1] = 0;
 88         len = 2+p;
 89         //Pair init_p = make_pair(-1, -1);
 90         v.clear();
 91         v.resize(50);
 92         for(int i = 0; i != n; ++i) {
 93             scanf("%s", G[i]);
 94             for(int j = 0; j != m; ++j) {
 95                 if(G[i][j] == ‘@‘) { v[0] = make_pair(i, j); }
 96                 else if(G[i][j] == ‘<‘) { v[len-1] = make_pair(i, j); }
 97                 else if(G[i][j] >= ‘A‘ && G[i][j] <= ‘J‘) { v[G[i][j]-‘A‘+1] = make_pair(i, j); }
 98             }
 99         }
100         //printf("%d\n", v.size());
101         for(int i = 0; i != len-1; ++i) {
102             for(int j = i+1; j != len; ++j) {
103                 bfs(i, j);// bfs所有结点(起点、宝藏、终点) 两两之间的最短距离
104                 //printf("%d\n", dis[i][j]);
105             }
106             //printf("%d %d\n", v[i].first, v[i].second);
107         }
108         //printf("------\n");
109         maxn = -1;
110         memset(vis2, 0, sizeof(vis2));
111         vis2[0] = 1;
112         dfs(0, 0, 0);
113         if(cnt) printf("\n");
114         printf("Case %d:\n", ++cnt);
115         if(maxn == -1) printf("Impossible\n");
116         else printf("The best score is %d.\n", maxn);
117     }
118     return 0;
119 }

原文地址:https://www.cnblogs.com/pupil-xj/p/11569138.html

时间: 2024-10-11 17:43:00

hdu 1044 bfs+dfs的相关文章

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 1983(BFS+DFS) 怪盗Kid

http://acm.hdu.edu.cn/showproblem.php?pid=1983 首先,题目要求出口和入口不能封闭,那么,只要把出口或入口的周围全给封闭了那盗贼肯定无法成功偷盗,出口或入口周围最多 会有四个点,所以初始答案ans=4(没必要计算出出口或入口可以封闭的最小值,就初始为4就好),然后从一到四枚举看有没有 最小的符合条件的值, 所以先用BFS查找出至少偷到一个宝石的最小时间的路径,记录下来,然后枚举封闭路径上的点递归回去,再BFS判断是否能偷盗 成功---DFS中插入BFS

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 1044(bfs+状压)

非常经典的一类题型 没有多个出口.这里题目没有说清楚 Collect More Jewels Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4684    Accepted Submission(s): 983 Problem Description It is written in the Book of The Lady: Afte

HDU ACM 1044 Collect More Jewels BFS+DFS

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

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