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) ...
随机推荐
- Android实现Activity页面跳转切换动画特效
了解Android程序设计的人应该知道,在Android 2.0之后有了overridePendingTransition(),其中里面两个参数,一个是前一个activity的退出,另一个activi ...
- lock关键字理解
>可以把lock关键字可以看成 try{ Monitor.Enter(x); //.. } finally{ Monitor.Exit(x); } 这样子的结构,当然使用lock关键字更方便 & ...
- easyui datagrid高度自适应问题
最近在使用datagrid的时候,发现在panel中嵌入一个datagrid时,当panel缩小时,datagrid下面会有一块空白,datagrid高度不能自适应,解决方法是在datagrid外面加 ...
- 谈谈CSS的布局,display、position、float
前言 前端一直是我的一个很大的缺憾,这段时间痛顶思痛,决定好好的把前台的东西加强,这不,在学习了一段时间js之后,在做一些小练习,却发现最基本的一些css知识却还不了解,所以便有了这篇博文. 块级元素 ...
- sql插入多条数据的sql语句
sql插入多条数据的sql语句 有三种方法:1.InSert Into <表名>(列名)Select <列名>From <源表名>如:INSERT INTO Ton ...
- C#生成唯一的ID保存到数据库
直接用.NET Framework 提供的 Guid() 函数: Guid.NewGuid()是指生成唯一码的规则 System.Guid.NewGuid().ToString()全球唯一标识符 (G ...
- Xcode6.2创建Empty Application
运行Xcode 6,创建一个Single View Application工程. 创建好后,把工程目录下的Main.storyboard和LaunchScreen.xib删除,扔进废纸篓. 打 ...
- 中南民航如何利用K2BPM构建业务流程?
广州市中南民航空管通信网络科技有限公司成立于2004年9月,负责民航中南地区通信网络.电报网络的建设与维护.民航空管信息系统的开发与维护.公司拥有一支技术精湛的研发队伍,在信息技术领域领跑于民航空管行 ...
- 在ubunut下使用pycharm和eclipse进行python远程调试
我比较喜欢Pycharm,因为这个是JetBrains公司出的python IDE工具,该公司下的java IDE工具--IDEA,无论从界面还是操作上都甩eclipse几条街,但项目组里有些人使用e ...
- iOS中Block使用探索
Block介绍 Block在ios 4.0之后加入,并大量使用在新的ios api中.block是一个匿名的代码块,可以传递给其他对象的参数,并得到返回值.从本质上讲,block同其他普通的变量类似, ...