hdu 1044 Collect More Jewels
题意:
一个n*m的迷宫,在t时刻后就会坍塌,问:在逃出来的前提下,能带出来多少价值的宝藏。
其中:
’*‘:代表墙壁;
'.':代表道路;
'@':代表起始位置;
'<':代表出口;
'A'~'J':代表宝藏;
解题思路:
本题有两种思路:1,bfs+状态压缩;相比之下耗时多;
2,bfs+dfs;耗时较少;
在这里着重介绍第一种方法:(博主也是现学现卖啦^_^)
因为宝藏的数目比较少,所以我们可以对宝藏进行状态压缩(用二进制表示宝藏是否已经拾取,1表示已拾取,0表示未拾取),
标记数组vis[i][x][y],i就是宝藏的拾取状态,(x,y)是当前搜索位置;(当然知道这些也不一定能ac)。
注意:(想要把题目ac的看过来)
1:不可能输出“Impossible”。
2:题目中的数据问题,题目的例子相当于有一个围墙,而可能数据并不总是如此。
3:首先是如何判断当前的路径是否应该结束(并不是到‘<’为止,因为可能还有时间到达其他的宝藏)。
下面就祝大家ac愉快啦
代码:
#include <cstdio>
#include <cstring>
#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;
#define N 55 struct node
{
int x, y, z, t, val;
}; int n, m, t, num;
int vis[<<][N][N], va[], dir[][] = {,, -,, ,, ,-};
char map[N][N]; int bfs (int sx, int sy)
{
int num = -; queue<node>Q;
node cur, next; cur.x = sx, cur.y = sy;
cur.val = cur.t = cur.z = ;
memset (vis, , sizeof(vis));
vis[][sx][sy] = ; Q.push(cur);
while (!Q.empty())
{
cur = Q.front();
Q.pop(); if (map[cur.x][cur.y] == '<')
{
if (cur.val > num)
num = cur.val;
}
if (cur.t > t)
return num;
for (int i=; i<; i++)
{
next.x = cur.x + dir[i][];
next.y = cur.y + dir[i][];
next.z = cur.z;
next.val = cur.val; if (next.x<m && next.x>= && next.y<n && next.y>=)
{
next.t = cur.t + ;
if (map[next.x][next.y] >= 'A' && map[next.x][next.y] <= 'Z')
{
int l = map[next.x][next.y] - 'A';
if ( !((<<l) & next.z) )
{
next.val += va[l];
next.z = (<<l) | next.z;
}
}
if (!vis[next.z][next.x][next.y] && map[next.x][next.y] != '*')
Q.push(next), vis[next.z][next.x][next.y] = ;
}
}
}
return num;
}
int main ()
{
int c, i, j, s, l = , sx, sy; scanf ("%d", &c); while (c --)
{
scanf ("%d %d %d %d", &n, &m, &t, &s); for (i=; i<s; i++)
scanf ("%d", &va[i]); for (i=; i<m; i++)
{
scanf ("%s", map[i]);
for (j=; j<n; j++)
if (map[i][j] == '@')
sx = i, sy = j;
} num = bfs (sx, sy);
if (l)
printf ("\n");
if (num != -)
printf ("Case %d:\nThe best score is %d.\n", ++l, num);
else
printf ("Case %d:\nImpossible\n", ++l, num);
} return ;
}
hdu 1044 Collect More Jewels的更多相关文章
- HDU 1044 Collect More Jewels(BFS+DFS)
Collect More Jewels Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- hdu.1044.Collect More Jewels(bfs + 状态压缩)
Collect More Jewels Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- hdu 1044 Collect More Jewels(bfs+状态压缩)
Collect More Jewels Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- hdu 1044(bfs+状压)
非常经典的一类题型 没有多个出口.这里题目没有说清楚 Collect More Jewels Time Limit: 2000/1000 MS (Java/Others) Memory Limi ...
- HDU 1044 BFS
Collect More Jewels Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- hdu 1044(bfs+dfs+剪枝)
Collect More Jewels Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- Collect More Jewels(hdu1044)(BFS+DFS)
Collect More Jewels Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Othe ...
- HDU Collect More Jewels 1044
BFS + 状态压缩 险过 这个并不是最好的算法 但是写起来比较简单 , 可以AC,但是耗时比较多 下面是代码 就不多说了 #include <cstdio> #include <c ...
- hdu Collect More Jewels
思路: 先用bfs求出入口,宝物,出口,两两之间的最短距离. 在用dfs搜索所有情况,求出从入口走到出口能获得的最大价值. 我们要解决几个问题:1.求入口到第一个取宝物的地方的最短距离 2.求第i个取 ...
随机推荐
- 下一代的中间件必须是支持docker规范的
下一代的中间件必须是支持docker规范的,这是中间件技术走向标准规范化的必经之路. 什么是 Docker? 答案是:Docker 是下一代的云计算模式.Docker 是下一代云计算的主流趋势. Do ...
- 抓包工具Fiddler使用宝典之捕获手机报文
Fiddler 是通过代理来实现数据捕获的.对 Android 手机来说,也是通过将网络连接的代理指向 PC 机的 Fiddler port.来实现数据包的拦截. 以下,我以我的一次实践为例,向大家介 ...
- C和Fortran互相传递动态数组
C和Fortran的相互调用传递数值的方法有很多,但是F03标准的出笼,使用ISO_C_BINDING进行C和Fortran的互相调用有着更显著的优势: 1.与编译器和平台无关: 2.Fortran中 ...
- 手机阅读行业SWOT分析
上个星期,在公司内部的分享活动上给童鞋们分享了手机阅读行业现状,小伙伴儿们嗷嗷待哺的眼神促使我把PPT转换为博客里的文字和图片,再一次更加深入地进入手机阅读. 通过SWOT分析分析我们能够对手机阅读行 ...
- ExtJs 中获取 radiobutton 的值
ExtJs中使用radiobutton,想在ExtJs本身代码中(注意,不是在后台喔)获取 radioButton 的值,居然发现很难,无从下手的感觉.后来在网上寻寻觅觅,痛苦摸索之后,真是大跌眼镜. ...
- 2016/05/13 Thinkphp 3.2.2 ①数据添加 ②收集表单数据入库操作 ③数据修改操作
①数据查询 add() 该方法返回被添加的新记录的主键id值 两种方式实现数据添加 数组方式数据添加 $goods = D(“Goods”); $arr = array(‘goods_name’=&g ...
- Codeforces 709E. Centroids 树形DP
题目链接:http://codeforces.com/contest/709/problem/E 题意: 给你一棵树,你可以任删一条边和加一条边,只要使得其仍然是一棵树,输出每个点是否都能成为重心 题 ...
- CXF Spring 使用
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...
- YTU 1006: Hero In Maze
1006: Hero In Maze 时间限制: 1000 Sec 内存限制: 64 MB 提交: 72 解决: 22 题目描述 500年前,Jesse是我国最卓越的剑客.他英俊潇洒,而且机智过人 ...
- javascript 省、市、地县三级联动
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><HTML><HEAD&g ...