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) ...
随机推荐
- RAID5和RAID10,哪种RAID更适合你(上)
[IT168 专稿]存储是目前IT产业发展的一大热点,而RAID技术是构造高性能.海量存储的基础技术,也是构建网络存储的基础技术.专家认为,磁盘阵列的性能优势得益于磁盘运行的并行性,提高设备运行并行度 ...
- HDU 2546(01背包)
饭卡 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...
- 46. Permutations——本质和树DFS遍历无异 fun: for i in nums fun(i)
Given a collection of distinct numbers, return all possible permutations. For example, [1,2,3] have ...
- jquery中ajax常用方法
index.html: <h3>$.get(url, [data], [callback], [type])<br/> $.post(url, [data], [callbac ...
- PDF 补丁丁 0.4.1.820 测试版发布:统一PDF的页面尺寸
之前删掉了统一页面尺寸功能,在这个版本给搬回来了. 调整页面留白的功能还没实现,请无视相关选项.
- Ubuntu 设置su密码
如果之前安装时没有设置root密码,可以如下设置: 命令窗口中输入:sudo passwd [sudo] password for 用户名: 这里输入你sudo 的密码输入新的 UNIX 密码: 重 ...
- Ubuntu 13.10 Broadcom BCM4313问题
开始找不到无线网卡,后来不知道怎么就出来了,但是速度很慢.用下面的方法解决的(我也不知道哪条命令起的作用,反正现在正常了): sudo apt-get remove --purge bcmwl-ker ...
- linux系统字符集
Linux中中文乱码问题通常是由于字符集与windows不兼容所引起,windows的中文字符集是双字节的GBK编码linux采用的是3字节的utf-8编码,所以在windows下用工具连接linux ...
- 一般处理文件.ashx中使用文件session遇到的问题
在给其他网站提供接口的时候用ashx做的,在文件调用cs中的方法,方法中的Session报错:System.NullReferenceException: 未将对象引用设置到对象的实例. /// &l ...
- intel的网卡故障
现象: 机器键盘接入,敲入无反应:机器无法ping通,整台机器假死状态. 查看message的日志,日志为如下内容: Aug :: TSMIS-CF kernel: ::19.0: eth0: Det ...