HDU 5025
http://acm.hdu.edu.cn/showproblem.php?pid=5025
蛇最多只有五条,状态压缩一下,vis增加两维,表示取得钥匙的状态和蛇的状态,然后一个优先队列的bfs即可解决问题,简单题
#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#include <queue>
#include <algorithm>
using namespace std ; int n,m ;
int sx,sy ;
int tx,ty ;
char mp[][] ;
int vis[][][][] ;
struct node
{
int x,y ;
int time ;
int snake ;
int key ;
friend bool operator <(node a,node b)
{
return a.time>b.time ;
}
} ;
int cnt ;
struct sk
{
int x,y ;
}ss[] ;
int OK(node a)
{
if(a.x==tx && a.y==ty)
{
if(a.key==m)return ;
}
return ;
}
int dx[]={,-,,} ;
int dy[]={,,,-} ;
int bfs(int x,int y)
{
priority_queue <node> q ;
node s ;
s.x=x ;s.y=y ;s.time= ;s.snake= ;s.key= ;
vis[x][y][][]= ;
q.push(s) ;
while(!q.empty())
{
node u=q.top() ;
if(OK(u))return u.time ;
q.pop() ;
for(int i= ;i< ;i++)
{
int xx=u.x+dx[i] ;
int yy=u.y+dy[i] ;
if(xx< || xx>=n || yy< || yy>=n)continue ;
if(mp[xx][yy]=='#')continue ;
if(vis[xx][yy][u.key][u.snake])continue ;
node T ;
T=u ;
T.x=xx ;T.y=yy ;T.time=u.time+ ;
if(mp[xx][yy]>='' && mp[xx][yy]<='')//遇到钥匙
{
int num=mp[xx][yy]-''- ;
if(T.key==num)
{
T.key++ ;
vis[xx][yy][T.key][T.snake]= ;
q.push(T) ;
}
else
{
vis[xx][yy][T.key][T.snake]= ;
q.push(T) ;
}
}
else if(mp[xx][yy]=='S')//遇到蛇
{
for(int i= ;i<cnt ;i++)
{
if(xx==ss[i].x && yy==ss[i].y)
{
if((T.snake>>i)&)
{
vis[xx][yy][T.key][T.snake]= ;
q.push(T) ;
}
else
{
T.time++ ;
T.snake+=(<<i) ;
vis[xx][yy][T.key][T.snake]= ;
q.push(T) ;
}
break ;
}
}
}
else
{
vis[xx][yy][T.key][T.snake]= ;
q.push(T) ;
}
}
}
return - ;
} int main()
{
while(~scanf("%d%d",&n,&m))
{
if(!n && !m)break ;
for(int i= ;i<n ;i++)
scanf("%s",mp[i]) ;
cnt= ;
for(int i= ;i<n ;i++)
{
for(int j= ;j<n ;j++)
{
if(mp[i][j]=='K')sx=i,sy=j ;
if(mp[i][j]=='T')tx=i,ty=j ;
if(mp[i][j]=='S')
{
ss[cnt].x=i ;
ss[cnt++].y=j ;
}
}
}
memset(vis,,sizeof(vis)) ;
int ans=bfs(sx,sy) ;
if(ans==-)puts("impossible") ;
else printf("%d\n",ans) ;
}
return ;
}
HDU 5025的更多相关文章
- hdu 5025 Saving Tang Monk 状态压缩dp+广搜
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4092939.html 题目链接:hdu 5025 Saving Tang Monk 状态压缩 ...
- HDU 5025 (BFS+记忆化状压搜索)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5025 题目大意: 迷宫中孙悟空救唐僧,可以走回头路.必须收集完钥匙,且必须按顺序收集.迷宫中还有蛇, ...
- HDU 5025:Saving Tang Monk(BFS + 状压)
http://acm.hdu.edu.cn/showproblem.php?pid=5025 Saving Tang Monk Problem Description <Journey to ...
- hdu 5025 bfs+状压
http://acm.hdu.edu.cn/showproblem.php?pid=5025 N*N矩阵 M个钥匙 K起点,T终点,S点需多花费1点且只需要一次,1-9表示9把钥匙,只有当前有I号钥匙 ...
- HDU 5025 Saving Tang Monk 【状态压缩BFS】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=5025 Saving Tang Monk Time Limit: 2000/1000 MS (Java/O ...
- 2014 网选 广州赛区 hdu 5025 Saving Tang Monk(bfs+四维数组记录状态)
/* 这是我做过的一道新类型的搜索题!从来没想过用四维数组记录状态! 以前做过的都是用二维的!自己的四维还是太狭隘了..... 题意:悟空救师傅 ! 在救师父之前要先把所有的钥匙找到! 每种钥匙有 k ...
- HDU 5025 Saving Tang Monk --BFS
题意:给一个地图,孙悟空(K)救唐僧(T),地图中'S'表示蛇,第一次到这要杀死蛇(蛇最多5条),多花费一分钟,'1'~'m'表示m个钥匙(m<=9),孙悟空要依次拿到这m个钥匙,然后才能去救唐 ...
- hdu 5025 Saving Tang Monk(bfs+状态压缩)
Description <Journey to the West>(also <Monkey>) is one of the Four Great Classical Nove ...
- [ACM] HDU 5025 Saving Tang Monk (状态压缩,BFS)
Saving Tang Monk Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
随机推荐
- 创建PO/SO
IF P_ZY EQ 'X'."直营订单 调拨单 PERFORM FRM_INIT_PO_HEADER. PERFORM FRM_INIT_PO_ITEM. PERFORM FRM_INIT ...
- BootStrap 最佳资源合集(转)
witter BootStrap是一款优秀的前端的框架,称得上是前端的一个框架利器.Web前端开发者每天都在与HTML.CSS.JavaScript打交道,然 而不少人都是在周而复始的写模板.样式和交 ...
- Java:Exception
异常: 就是程序在运行时出现不正常的情况. 异常的由来:问题也是现实生活中一个具体的事物,也可以通过java的类的形式进行描述,并封装成对象.其实就是Java对不正常情况进行描述后的对象的体现. 两种 ...
- java面向对象编程—— 第三章 程序流程控制
3.1流程控制 三种基本技术可以改变程序的控制流程: ① 调用方法:调用方法将导致控制流程离开当前方法,转移到被调用的方法: ② 选择:java中有两种做出选择的机制:if/else语句和sw ...
- 用户列表-投资记录sql
--普通标.定向标.新手标.老互融计划-投资记录表select bid.borrow_id, (select yyb.borrow_valid_time from YYD_Borrow_BorrowI ...
- 二模 (11) day2
第一题: 题目大意: 有一本n个单词的字典,其中每个单词的长度不超过4且大于0.现在给你一篇文章,文章中没有分隔符,只有小写字母.现在需要你修改最少的字母,使文章(长度为m 是由字典中的单词构成. n ...
- dancing link 学习资源导航+心得
dancing link简直是求解数独的神器,NOIP2009最后一题靶形数独,DFS 各种改变搜索顺序 都没法过,最后还是用了卡时过得.用dancing link写,秒杀所有数据,总时间才400ms ...
- 一模 (2) day1
第一题: 题目大意: 设 2n 张牌分别标记为 1, 2, ..., n, n+1, ..., 2n,初始时这 2n 张牌按其标号从小到大排列.经一次洗牌后,原来的排列顺序变成 n+1, 1, n+2 ...
- C# SQLiteDataReader获得数据库指定字段的值
获得数据库指定字段的值,赋给本地变量 (1)如下,获得userinfo数据表里的字段"userid"."orgid", string userid=" ...
- Oracle常用的函数
1.常用的函数分为五大类: 字符函数.数字和日期函数.数字函数.转换函数.混合函数 2.字符函数 字符函数主要用于修改字符列.这些函数接受字符输入,返回字符或数字值.Oracle 提供的一些字符函数如 ...