HDU 5025 Saving Tang Monk.
来源:互联网 发布:mac imovie不见了 编辑:程序博客网 时间:2024/04/30 17:53
【题意】求悟空到师傅的最短距离,这中途会有一些门,悟空必须依次拿到钥匙,打开所有的门,中途遇到妖怪就会多停留1s,求悟空救出师傅的最短时间!
【解题思路】我的第一道dfs+状压!其中dp[x][y][k][s]中,x,y代表位置,k代表拿到了k把钥匙,s代表状态。
【AC代码】
#include <stdio.h>#include <queue>#include <string.h>#include <assert.h>#include <iostream>using namespace std;const int maxn = 102;const int inf = 0x3f3f3f3f;struct node{ int x,y,k,s,d; node(){} node(int x,int y,int k,int s,int d):x(x),y(y),k(k),s(s),d(d){}};int dir[4][2]={{0,1},{0,-1},{-1,0},{1,0}};int dp[maxn][maxn][10][32];char maze[maxn][maxn];int n,m,sx,sy,cnt;int bfs(int sx,int sy){ queue<node>que; int ans = inf; que.push(node(sx,sy,0,0,0)); while(!que.empty()) { node cur = que.front(); que.pop(); int x=cur.x,y=cur.y,k=cur.k,s=cur.s; if(k==m&&maze[x][y]=='T') { ans = min(ans,cur.d); } if(dp[x][y][k][s]!=-1)continue; dp[x][y][k][s]=cur.d; for(int i=0;i<4;i++) { int dx=x+dir[i][0]; int dy=y+dir[i][1]; int st = maze[dx][dy]-'A'; if(st>=0&&st<cnt)//杀蛇 { if(s&(1<<st)) que.push(node(dx,dy,k,s,cur.d+1)); else que.push(node(dx,dy,k,s^(1<<st),cur.d+2)); } else//拿钥匙 { if(maze[dx][dy]=='1'+k) { que.push(node(dx,dy,k+1,s,cur.d+1)); } else if((maze[dx][dy]>='1'&&maze[dx][dy]<'1'+m)||(maze[dx][dy]=='.'||maze[dx][dy]=='K'||maze[dx][dy]=='T')) { que.push(node(dx,dy,k,s,cur.d+1)); } } } } return ans;}int main(){ while(~scanf("%d%d",&n,&m)) { cnt = 0; if(n==0&&m==0)return 0; memset(dp,-1,sizeof(dp)); memset(maze,0,sizeof(maze)); for(int i=1; i<=n; i++) { scanf("%s",maze[i]+1); for(int j=1; j<=n; j++) { if(maze[i][j]=='S') { maze[i][j] = 'A'+cnt; cnt++; } if(maze[i][j]=='K') { sx=i,sy=j; } } }// for(int i=1; i<=n; i++)// {// for(int j=1; j<=n; j++)// {// printf("%c",maze[i][j]);// }// printf("\n");// } int ans = bfs(sx,sy); if(ans==inf) { puts("impossible"); } else { printf("%d\n",ans); } } return 0;}
2 0
- HDU 5025 Saving Tang Monk
- HDU - 5025 Saving Tang Monk
- HDU 5025 Saving Tang Monk
- HDU 5025 Saving Tang Monk
- HDU 5025 Saving Tang Monk.
- HDU 5025 Saving Tang Monk
- Saving Tang Monk HDU
- 【HDU】5025 Saving Tang Monk 状压最短路
- HDU 5025 Saving Tang Monk (复杂BFS)
- 【搜索】 HDU 5025 Saving Tang Monk
- HDU 5025 Saving Tang Monk(bfs)
- Saving Tang Monk - HDU 5025 搜索
- 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 --BFS
- iOS开发--生成二维码及扫描二维码(原生)
- 2016.4.7每日小结
- Spark on yarn CapacityScheduler中的ResourceCalculator(资源计算器)
- 【学习笔记----数据结构07-队列】
- 一个Java码农的Node之旅
- HDU 5025 Saving Tang Monk.
- IOS使用Jenkins进行持续集成
- git的深入理解与使用
- Windows Server 2012 安装JDK
- Androidd Intent总结
- Android 最火快速开发框架androidannotation简介
- 信用卡
- 2016.4.8每日小结
- php中的字符串操作