HDU 5025:Saving Tang Monk (BFS + 状压)
来源:互联网 发布:世辉律师事务所 知乎 编辑:程序博客网 时间:2024/06/09 19:08
题意:
给出一个地图,#是墙 K是起点T是终点数字是钥匙,S是蛇,经过此处需要2秒,而如果第二次经过同一个S,第二次需要1秒,钥匙只是一个个拿,按数字大小。 在到达终点时候需要拿到所有钥匙
思路:
将蛇状压编号,将钥匙记录状态是第几个
#include<cstdio>#include<cstring>#include<queue>using namespace std;const int N = 105;int vis[N][N][1 << 5+1][10];int dir[4][2] = {{-1, 0},{1, 0},{0, 1},{0, -1}};char mp[N][N];int snak[N][N];struct node{ int x,y; int key; int snake; int step; bool operator <(node a)const{ return step>a.step; }};int ans;int n,m;const int inf=0x3f;void bfs(int sx,int sy){ node start; start.x=sx,start.y=sy; start.snake=0,start.step=0; start.key=0; priority_queue<node> q; q.push(start); vis[sx][sy][0][0]=1; while(!q.empty()) { node t=q.top(); q.pop(); for(int i=0;i<4;i++) { node tmp=t; tmp.x+=dir[i][0]; tmp.y+=dir[i][1]; tmp.step++; if(tmp.x<1||tmp.y<1||tmp.x>n||tmp.y>n||vis[tmp.x][tmp.y][tmp.snake][tmp.key]||mp[tmp.x][tmp.y]=='#') { continue; } if(mp[tmp.x][tmp.y]=='S') { int nowsnake=tmp.snake; if(nowsnake&(1<<snak[tmp.x][tmp.y])) { q.push(tmp); }else{ tmp.snake|=(1<<snak[tmp.x][tmp.y]); tmp.step++; q.push(tmp); } } else if(mp[tmp.x][tmp.y]-'0'==tmp.key+1) { tmp.key++; q.push(tmp); } else if(mp[tmp.x][tmp.y]=='T'&&tmp.key==m) { ans=tmp.step; return; } else{ q.push(tmp); } vis[tmp.x][tmp.y][tmp.snake][tmp.key]=1; } }}int main(){ while(~scanf("%d%d",&n,&m)) { if(n==0&&m==0)break; memset(vis,0,sizeof(vis)); ans=inf; int cnt=0; int sx,sy; for(int i=1;i<=n;i++) scanf("%s",&mp[i][1]); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(mp[i][j]=='S') snak[i][j]=++cnt; if(mp[i][j]=='K') sx=i,sy=j; } } bfs(sx,sy); if(ans==inf) printf("impossible"); else printf("%d",ans); printf("\n"); }}
阅读全文
0 0
- HDU 5025 - Saving Tang Monk(状压 + BFS)
- HDU 5025 Saving Tang Monk(BFS+状压)
- HDU 5025 Saving Tang Monk(bfs)
- hdu 5025Saving Tang Monk(BFS)
- HDU 5025:Saving Tang Monk (BFS + 状压)
- HDU 5025 Saving Tang Monk (复杂BFS)
- hdu 5025 Saving Tang Monk(bfs)
- HDU 5025 Saving Tang Monk bfs
- HDU 5025 Saving Tang Monk --BFS
- HDU 5025 Saving Tang Monk BFS搜索
- HDU-#5025 Saving Tang Monk(BFS+状态压缩)
- [ACM] HDU 5025 Saving Tang Monk (状态压缩,BFS)
- 【ACM] HDU 5025 Saving Tang Monk (状态压缩,BFS)
- hdu-5025 Saving Tang Monk (BFS + 状态压缩)
- hdu 5025 Saving Tang Monk(BFS+状态压缩)
- HDU 5025 Saving Tang Monk(bfs+状态压缩)
- HDU 5025 Saving Tang Monk
- HDU - 5025 Saving Tang Monk
- 建议Linux操作系统初学者的学习线路图
- Spring Boot 快速上手(三)数据操作
- VS配置lib库问题
- C/C++ 生成[X,Y]内的随机数
- 基于opencv查看图像各像素点的RGB值
- HDU 5025:Saving Tang Monk (BFS + 状压)
- c++引用
- AppCompatActivity和Activity的主题设置问题
- Spring Boot入门学习笔记(一)
- mtk6735 [Audio App]如何内置FM频道
- 《深入理解Java虚拟机》——类文件结构之魔数常量池
- 类与类的关系杂谈
- Lua学习笔记4-赋值语句
- Percona Server5.7.17二进制安装_for redhat 6.1