#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
int row,line,xx[4]={-1,1,0,0},yy[4]={0,0,-1,1};
char map[100][100];
bool vis[100][100];
struct node
{
int x,y,step;
}st;
void init()
{
int i,j;
bool flag=1;
for(i=0;i<row;i++)
scanf("%s",map[i]);
for(i=0;flag&&i<row;i++)
for(j=0;flag&&j<line;j++)
if(map[i][j]=='S')
{
st.x=i;
st.y=j;
st.step=0;
flag=0;
}
memset(vis,0,sizeof(vis));
vis[st.x][st.y]=1;
}
bool iscan(int x,int y)
{
if(x<0||y<0||x>=row||y>=line||vis[x][y]||map[x][y]=='*')
return 0;
return 1;
}
void bfs()
{
int i;
queue<node>qq;
node t1,t2;
qq.push(st);
while(qq.size())
{
t1=qq.front();
qq.pop();
if(map[t1.x][t1.y]=='T')
{
printf("%d\n",t1.step);
return;
}
for(i=0;i<4;i++)
{
t2=t1;
t2.x+=xx[i];
t2.y+=yy[i];
t2.step++;
if(!iscan(t2.x,t2.y))
continue;
if(map[t2.x][t2.y]=='.'||map[t2.x][t2.y]=='T')
{
vis[t2.x][t2.y]=1;
qq.push(t2);
}
else if((map[t2.x][t2.y]=='|'&&!(t1.step&1))||(map[t2.x][t2.y]=='-'&&(t1.step&1)))
{
if(i>1)
{
t2=t1;
t2.step++;
qq.push(t2);
continue;
}
t2.x+=xx[i];
if(!iscan(t2.x,t2.y))
continue;
vis[t2.x][t2.y]=1;
qq.push(t2);
}
else
{
if(i<2)
{
t2=t1;
t2.step++;
qq.push(t2);
continue;
}
t2.y+=yy[i];
if(!iscan(t2.x,t2.y))
continue;
vis[t2.x][t2.y]=1;
qq.push(t2);
}
}
}
}
int main()
{
while(scanf("%d%d",&row,&line)!=EOF)
{
init();
bfs();
}
}相关推荐
HDU 1072 (基础BFS)
这个题 还有有点烦的……应该是我菜的缘故…… 其实刚开始一点问题都没有 就寻常的BFS过去 开始觉得他烦的时候 是我发现这道题他不能标记…… 对他可以回头走 甚至是必须回头走(例如案例二) 总之我的代码中还可以看到标记数组的痕迹 回头走了 一旦有两个4离得近了 小于6步那么 就会死循环…… 所以就应该标记4 这个4不能让他来回走 然后 我这个题我还用了优先队列 其实完全没有必要 ...
HDU - 2102 bfs简单题
#include <iostream> #include <cstdio> #include <cstring> #include <map> #include <vector> #include <bits/stdc++.h> #define inf 0x3f3f3f3f using namespace std; int ...
hdu1180(BFS)
题目链接 诡异的楼梯 5 5 **..T **.*. ..|.. .*.*. S.... 如图所示的地图,|代表楼梯,每分钟移动一次方向,只能顺着楼梯的方向走,每次可以在 . 或S或T处停留,求从S到T的最小步数 没有什么难度,在楼梯的地方模拟清楚就行,把方向的各个情况弄清楚 记录时间差,判断到达楼梯时的方向, 当是|的时候,只能沿着上下方向走, 当是—时只能沿着
HDU 1180.诡异的楼梯
诡异的楼梯 Time Limit:1000MSMemory Limit:65536KB64bit IO Format:%I64d & %I64u SubmitStatusPracticeHDU 1180 Description Hogwarts正式开学以后,Harry发现在Hogwarts里,某些楼梯并不是静止不动的,相反,他们每隔一分钟...
hdu诡异的楼梯(BFS+优先队列)
http://acm.hdu.edu.cn/showproblem.php?pid=1180 这题交了7次 悲剧了 前几次 因为把+行想成是左右走了 一直WA 后来看出来了 又把走过的楼梯给标记了 这里的楼梯不能标记 因为可以在原地等着楼梯转变 加的时间有可能是2 这样普通队列满足不了最少的先搜 就用优先队列了 View Code 1 #include<stdio.h>...
期望值Markov过程(马尔科夫过程),hdu1204糖果大战
先来看一个例子,即赌徒输光问题: 赌徒甲有资本a元,赌徒乙有资本b元,两人进行赌博,每赌一局输者给赢者1元,没有和局,直赌至两人中有一人输光为止。设在每一局中,甲获胜的概率为p,乙获胜的概率为q=1-p,求甲先输光的概率。 解:先设c=a+b; r=q/p; 这个实际上是Markov过程(马尔科夫过程),具体细节不说了,结果就是: 出自:
hdu2204Eddy's爱好
hdu2204Eddy's爱好的解题思路,以及一些需要注意的地方,比如读入的方式之类的,欢迎讨论
hdu5071-Chat
现场赛的时候也是被坑了,还以为会精细设计一组牛逼的数据卡时间,还有题目里没说是否聊天字数清零的问题,也是坑, 第一次区域赛,感觉就是题目也没什么特别难的,有时题意也没说清楚,我想旁边的北航那个队应该是跟我想的一样,然后被坑了吧,他们一直没 过这题,不然会是第二?反正跟我没关系 直接模拟,也不用考虑超时,数据是随机的. 需要注意的是,如果关掉一个之后又打开
hdu 5031 Lines 爆搜
其实嘞,这个线可以只延伸一端 然后嘞,爆搜一次就可以 最后嘞,600-800ms过 本弱就是弱啊,你来打我呀…… #include #include #include #include using namespace std; int a[100][100]; int n,m,ans; bool dfs(int step) { int i,j,t,ii,jj,x,y,cnt,tx
hdu2586How far away ?
用tarjan解hdu2586,稍微谈了这个算法的实现,欢迎讨论
hdu3790最短路径问题
链式向前星+spfa解hdu3790的结题报告,解释了链式向前星的原理,欢迎讨论
hdu1104 Remainder bfs找算式是否有解……
hdu1104 Remainder bfs找算式是否有解……
hdu4865Peter's Hobby马尔科夫过程
hdu4865Peter's Hobby马尔科夫过程,欢迎讨论
hdu2222Keywords Search字典树入门……
hdu2222Keywords Search字典树入门……
爆搜解hdu1572下沙小面的(2)
爆搜解hdu1572下沙小面的(2),欢迎讨论
hdu1016Prime Ring Problem
爆搜解hdu1016Prime Ring Problem,欢迎讨论
hdu3986Harry Potter and the Final Battle
spfa和链式向前星解hdu3986的删掉最短路任意一条边的最坏结果问题,欢迎讨论
608




被折叠的 条评论
为什么被折叠?



