1. 程式人生 > >hdu1180詭異的樓梯(廣搜)

hdu1180詭異的樓梯(廣搜)

題目解析:對於樓梯來說,不進行 標記,當到達樓梯時,如果可以走並且跨過樓梯之後的點也可以走,那麼就走樓梯,否則的話,就等一分鐘,即當前節點的時間加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; }