hdu 1180
来源:互联网 发布:月中天 知乎 编辑:程序博客网 时间:2024/06/18 13:03
这篇代码借鉴的其他大神的,代码风格十分整洁,思路清晰,没有多余的冗长的代码,甚至连括号都没法删减,这让我对逐渐养成一个
规范的代码书写格式有了重新的认识
C - 诡异的楼梯
Crawling in process...Crawling failedTime Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64uDescription
Hogwarts正式开学以后,Harry发现在Hogwarts里,某些楼梯并不是静止不动的,相反,他们每隔一分钟就变动一次方向.
比如下面的例子里,一开始楼梯在竖直方向,一分钟以后它移动到了水平方向,再过一分钟它又回到了竖直方向.Harry发现对他来说很难找到能使得他最快到达目的地的路线,这时Ron(Harry最好的朋友)告诉Harry正好有一个魔法道具可以帮助他寻找这样的路线,而那个魔法道具上的咒语,正是由你纂写的.
比如下面的例子里,一开始楼梯在竖直方向,一分钟以后它移动到了水平方向,再过一分钟它又回到了竖直方向.Harry发现对他来说很难找到能使得他最快到达目的地的路线,这时Ron(Harry最好的朋友)告诉Harry正好有一个魔法道具可以帮助他寻找这样的路线,而那个魔法道具上的咒语,正是由你纂写的.
Input
测试数据有多组,每组的表述如下:
第一行有两个数,M和N,接下来是一个M行N列的地图,'*'表示障碍物,'.'表示走廊,'|'或者'-'表示一个楼梯,并且标明了它在一开始时所处的位置:'|'表示的楼梯在最开始是竖直方向,'-'表示的楼梯在一开始是水平方向.地图中还有一个'S'是起点,'T'是目标,0<=M,N<=20,地图中不会出现两个相连的梯子.Harry每秒只能停留在'.'或'S'和'T'所标记的格子内.
第一行有两个数,M和N,接下来是一个M行N列的地图,'*'表示障碍物,'.'表示走廊,'|'或者'-'表示一个楼梯,并且标明了它在一开始时所处的位置:'|'表示的楼梯在最开始是竖直方向,'-'表示的楼梯在一开始是水平方向.地图中还有一个'S'是起点,'T'是目标,0<=M,N<=20,地图中不会出现两个相连的梯子.Harry每秒只能停留在'.'或'S'和'T'所标记的格子内.
Output
只有一行,包含一个数T,表示到达目标的最短时间.
注意:Harry只能每次走到相邻的格子而不能斜走,每移动一次恰好为一分钟,并且Harry登上楼梯并经过楼梯到达对面的整个过程只需要一分钟,Harry从来不在楼梯上停留.并且每次楼梯都恰好在Harry移动完毕以后才改变方向.
注意:Harry只能每次走到相邻的格子而不能斜走,每移动一次恰好为一分钟,并且Harry登上楼梯并经过楼梯到达对面的整个过程只需要一分钟,Harry从来不在楼梯上停留.并且每次楼梯都恰好在Harry移动完毕以后才改变方向.
Sample Input
5 5**..T**.*...|...*.*.S....
Sample Output
7
Hint
Hint 地图如下:
ac代码:
#include<iostream>#include<cstdio>#include<cstring>#include<queue>using namespace std;const int M=25;const int inf=1<<30;const char road='.';const char t1='|';const char t2='-';const char start='S';const char endd='T';const char obstacle='*';const char inqueue='#';char map[M][M];int n,m;int revise[][2]={{-1,0},{0,1},{1,0},{0,-1}};struct p{ int x,y,minite; p(int x=-1,int y=-1):x(x),y(y){minite=0;}}s;int BFS(){ queue<p>que; que.push(s); while(!que.empty()) { p now=que.front();que.pop(); if(endd==map[now.x][now.y])return now.minite;//找到终点 map[now.x][now.y]=obstacle; for(int i=0;i<4;i++)//四个方向 { int next_x=revise[i][0]+now.x; int next_y=revise[i][1]+now.y; if(next_x>=0&&next_x<n&&next_y>=0&&next_y<m)//没有出界 { if(map[next_x][next_y]==obstacle)continue; else if(map[next_x][next_y]==road||map[next_x][next_y]==endd)//如果是路或者是终点 { p next=p(next_x,next_y); next.minite=now.minite+1; (map[next_x][next_y]!=endd)?(map[next_x][next_y]=inqueue):(1); que.push(next); } else if(map[next_x][next_y]==t1||map[next_x][next_y]==t2) //如果是梯子 { if((1==1||3==i)&&(map[now.x][now.y+revise[i][1]*2]!=obstacle))//左右方向移动 {if(now.y+revise[i][1]*2>=0&&now.y+revise[i][1]*2<m)//没有出界 { if((map[next_x][next_y]==t1&&now.minite%2==1)||(map[next_x][next_y]==t2&&now.minite%2==0))//梯子恰好能过去 { p next=p(now.x,now.y+revise[i][1]*2); next.minite=now.minite+1; que.push(next); } else//暂时不能过去 { p next=p(now.x,now.y); next.minite=now.minite+1; que.push(next); }}} else if((i==0||i==2)&&(map[now.x+revise[i][0]*2][now.y]!=obstacle))//上下方向移动 {if(now.x+revise[i][0]*2>=0&&now.x+revise[i][0]*2<n)//没有出界 {if((map[next_x][next_y]==t1&&now.minite%2==0)||(map[next_x][next_y]==t2&&now.minite%2==1))//梯子恰好能过去 { p next=p(now.x+revise[i][0]*2,now.y); next.minite=now.minite+1; que.push(next); } else//暂时不能过去 { p next=p(now.x,now.y); next.minite=now.minite+1; que.push(next); } }}} } } }return 0; }int main(){ while(scanf("%d %d",&n,&m)!=EOF) { getchar(); for(int i=0;i<n;i++) {for(int j=0;j<m;j++) {scanf("%c",&map[i][j]);if(start==map[i][j])s=p(i,j);}getchar();} printf("%d\n",BFS()); } return 0;}
阅读全文
0 0
- hdu 1180
- hdu 1180
- hdu 1180
- hdu 1180
- HDU 1180(bfs)
- HDU 1180 搜索
- hdu 1180 BFS
- HDU 1180 诡异楼梯
- hdu 1180 bfs(奇偶性)
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- java边界布局案例练习
- 快速排序的理解
- 【HTML/JS】百度地图javascriptAPI点击地图得到坐标(拾取坐标) 标签: 百度地图坐标
- Linux 下用脚shell脚本实现进度条的编写
- AS开发中出现Error(九)——app\build\intermediates\res\resources-xxx-stripped.ap_' specified for property 'res
- hdu 1180
- Jquery 获取 radio选中值
- ORACLE 用sys.dbms_sql执行SQL例
- Hibernate缓存机制
- Serializable和Parcelable的区别
- 大富豪5.3全网首发,真正的5.3正版破解授权,不是高防端
- Java应用程序运行时监控方法(一)——JVMTI的应用
- java nio
- Python小练习