代码:
#include<stdio.h>
#include<queue>
#include<string.h>
int map[305][305],n,m;
int zy[]={0,0,1,-1},sx[]={1,-1,0,0};
using namespace std;
struct node
{
friend bool operator< (node n1, node n2) //优先级。。
{
return n1.step> n2.step;
}
int x;
int y;
int step;
};
void bfs(int x1,int y1)
{
int a,b,i,j,loop=0;
int min=1;
node k={x1,y1,min};
priority_queue<node> q;
q.push(k);
while(!q.empty())
{
i=q.top().x;
j=q.top().y;
min=q.top().step;
q.pop();
for(a=0;a<4;a++)
{
x1=i+zy[a];
y1=j+sx[a];
if(map[x1][y1]==1||map[x1][y1]==2)
{
node p1={x1,y1,min+map[x1][y1]};
q.push(p1);
map[x1][y1]=0;
}
if(map[x1][y1]==4)
{
loop=1;
break;
}
}
if(loop==1)
{
break;
}
}
if(loop==1)
printf("%d\n",min);
else
printf("-1\n");
}
int main()
{
int a,b;
char ch;
while(1)
{
scanf("%d %d",&n,&m);
if(n==0&&m==0)
break;
memset(map,0,sizeof(map));//这个不用解释了吧。。在外面加一层0。。
for(a=1;a<=n;a++)
{
getchar();//注意。。少了你就悲剧了。。
for(b=1;b<=m;b++)
{
scanf("%c",&ch);
if(ch=='Y') //you
map[a][b]=3;
else if(ch=='T')
map[a][b]=4;//目标
else if(ch=='S'&&ch=='R')
map[a][b]=0; //不能走
else if(ch=='E')
map[a][b]=1;
else if(ch=='B') //注意呀。。这句话换成else结果就错了。。不信你试试。。
map[a][b]=2;
}
}
for(a=1;a<=n;a++)
for(b=1;b<=m;b++)
if(map[a][b]==3)
bfs(a,b);
}
}
原题链接: 点击打开
有点郁闷呀!!早就该ac的题 找了一天的错。。。⊙﹏⊙。。找到错误后 还不知道原因。。先交了再说吧。。英文题 看懂题以后其实挺简单的。。广度优先搜索+优先队列就能ac了。。就是一些细节要注意一下。。要不然就一直wr了。。。
代码在上面::