hdu1180诡异的楼梯(广搜)
来源:互联网 发布:c语言做窗口按钮 编辑:程序博客网 时间:2024/06/02 08:57
题目链接:click here~
题目解析:对于楼梯来说,不进行 标记,当到达楼梯时,如果可以走并且跨过楼梯之后的点也可以走,那么就走楼梯,否则的话,就等一分钟,即当前节点的时间加1然后 加入队列,其他的就跟一本的搜索一样了。
代码如下;
#include<stdio.h>#include<string.h>#include<queue>using namespace std;struct node{ int x; int y; int time;};char map[23][23];int vis[23][23];int m,n,a,b;int dx[5]={1,-1,0,0};int dy[5]={0,0,1,-1};void bfs(){ memset(vis,0,sizeof(vis)); node node1,node2; queue<node>q; node1.x=a; node1.y=b; node1.time=0; q.push(node1); vis[node1.x][node1.y]=1; while(!q.empty()) { node2=q.front(); // printf("%d %d %d--->\n",node2.x,node2.y,node2.time); q.pop(); if(map[node2.x][node2.y]=='T') { printf("%d\n",node2.time); return; } for(int i=0;i<4;i++) { node1.x=node2.x+dx[i]; node1.y=node2.y+dy[i]; if((map[node1.x][node1.y]=='.'||map[node1.x][node1.y]=='T')&&!vis[node1.x][node1.y]) { node1.time=node2.time+1; q.push(node1); vis[node1.x][node1.y]=1; } if(map[node1.x][node1.y]=='*') continue; if(map[node1.x][node1.y]=='-') { if(node2.time%2==0) //也就是说楼梯当前的状态任然是'-' { if(node1.x==node2.x) //横坐标相同,说明此时可以从楼梯过 { node1.y=node1.y*2-node2.y; //从楼梯过去之后纵坐标要发生变化 if(node1.y>=1&&node1.y<=n&&(map[node1.x][node1.y]=='.'||map[node1.x][node1.y]=='T')&&!vis[node1.x][node1.y]) node1.time=node2.time+1; q.push(node1); vis[node1.x][node1.y]=1; } else //说明此时不可以从楼梯过,要等待1分钟 { node1.time=node2.time+1; node1.x=node2.x; node1.y=node2.y; q.push(node1); vis[node1.x][node1.y]=1; } } else //说明此时的状态时'|' { if(node1.y==node2.y) //纵坐标相同,说明此时可以从楼梯过 { node1.x=node1.x*2-node2.x; if(node1.x>=1&&node1.x<=m&&(map[node1.x][node1.y]=='.'||map[node1.x][node1.y]=='T')&&!vis[node1.x][node1.y]) { node1.time=node2.time+1; q.push(node1); vis[node1.x][node1.y]=1; } } else { node1.x=node2.x; node1.y=node2.y; node1.time=node2.time+1; q.push(node1); vis[node1.x][node1.y]=1; } } } if(map[node1.x][node1.y]=='|') { if(node2.time%2==0) //说明此时的状态任然是'|' { if(node1.y==node2.y) //如果纵坐标相同说明此时可以从楼梯过 { node1.x=node1.x*2-node2.x; if(node1.x>=1&&node1.x<=m&&(map[node1.x][node1.y]=='.'||map[node1.x][node1.y]=='T')&&!vis[node1.x][node1.y]) { node1.time=node2.time+1; q.push(node1); vis[node1.x][node1.y]=1; } } else { node1.x=node2.x; node1.y=node2.y; node1.time=node2.time+1; q.push(node1); vis[node1.x][node1.y]=1; } } else //说明此时的状态是'-' { if(node1.x==node2.x) //横坐标相同,说明此时可以从楼梯过 { node1.y=node1.y*2-node2.y; if(node1.y>=1&&node1.y<=n&&(map[node1.x][node1.y]=='.'||map[node1.x][node1.y]=='T')&&!vis[node1.x][node1.y]) { node1.time=node2.time+1; q.push(node1); vis[node1.x][node1.y]=1; } } else //横坐标不相同,说明此时需要等待1分钟 { node1.x=node2.x; node1.y=node2.y; node1.time=node2.time+1; q.push(node1); vis[node1.x][node1.y]=1; } } } } }}int main(){ while(scanf("%d%d",&m,&n)!=EOF) { for(int i=1;i<=m;i++) { getchar(); for(int j=1;j<=n;j++) { scanf("%c",&map[i][j]); if(map[i][j]=='S') { a=i; b=j; } } } bfs(); } return 0;}
0 0
- hdu1180诡异的楼梯(广搜)
- HDU1180 诡异的楼梯 广搜 优先队列
- hdu1180诡异的楼梯【优先队列+广搜】
- HDU1180 诡异的楼梯(广搜BFS+优先队列)
- hdu1180 诡异的楼梯
- HDU1180 诡异的楼梯
- hdu1180 诡异的楼梯
- hdu1180诡异的楼梯
- HDU1180 诡异的楼梯
- HDU1180-诡异的楼梯
- hdu1180诡异的楼梯(bfs)
- hdu1180 诡异的楼梯 (广搜 做着比较有chengjiuga)
- HDU1180 诡异的楼梯--BFS
- hdu1180诡异的楼梯 bfs
- hdu1180诡异的楼梯(bfs)
- HDU1180 诡异的楼梯[dfs]
- hdu1180 诡异的楼梯--BFS
- HDU1180-诡异的楼梯(bfs)
- Intel 主板 USB 3.0 XHCI控制器端口配置
- 数组 【java笔记】
- 什么是socket(网络大神略过,网络小白比如我进)
- Codeforces Round #FF (Div. 2)446A - DZY Loves Sequences(最长上升子序列变形)
- 幕人网门窗幕墙论坛介绍
- hdu1180诡异的楼梯(广搜)
- Shell scriptp
- ACM小技巧
- 使用c3p0数据库连接池时出现com.mchange.v2.resourcepool.TimeoutException
- Cannot implicitly convert type 'System.Web.HttpPostedFile' to 'System.Web.HttpPostedFileBase'
- 珍爱收益,远离点融
- CocoStudio sample讲解 SampleChangeEquip 换装系统
- 黑马程序员-内存管理基础知识
- Android—Bitmap和Drawable