广度优先搜索问题,程序运行时终止,求帮忙看下哪里的错误?
题目描述两个人约好一起吃饭。他们俩只能向上,下,左,右移动到相邻的地方,每走一步花费11分钟,找出两个人路上耗时之和最短的吃饭的地方。
输入
输入包含多组数据。
每组数据包括,两个数字n,m。(2<=n,m<=200)。
接下来n行,每行m个字母。
‘Y’ 表示第一个人的位置
‘M’ 表示第二个人的位置
‘#’ 表示墙
‘.’ 表示路
‘@’ 表示可以吃饭的地方
输出
每组数据输出他们到达同一个吃饭地点消耗的总时间的最小值。数据保证他们总能相见。
样例输入
4 4
Y.#@
....
.#..
@..M
4 4
Y.#@
....
.#..
@#.M
5 5
Y..@.
.#...
.#...
@..M.
#...#
样例输出
66
88
66
代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char a[200][200],visited[200][200];
struct step{
int x;
int y;
int steps;
}st;
struct step s[40000];
int f(char a[][200],int n,int m,struct step *s,int x0,int y0,int x1,int y1){
memset(s,0,sizeof(struct step)*10);
memset(visited,0,sizeof(visited));
struct step *head,*tail,*tail0;
s[0].x=x0;
s[0].y=y0;
s[0].steps=0;
visited[x0][y0]=1;
head=s;
tail=s+1;
int k=1;
while((tail-head)!=0){
if((*head).x==x1 && (*head).y==y1){
return (*head).steps;
}
tail0=tail;
for(int i=0;i<4;i++){
if(i==0){
st.x=(*head).x+1;
st.y=(*head).y;
}
else if(i==1){
st.x=(*head).x-1;
st.y=(*head).y;
}
else if(i==2){
st.x=(*head).x;
st.y=(*head).y+1;
}
else if(i==3){
st.x=(*head).x;
st.y=(*head).y-1;
}
if(st.x>=0 && st.x<n && st.y>=0 && st.y<m && a[st.x][st.y]!='#' && visited[st.x][st.y]==0){
st.steps=k;
visited[st.x][st.y]=1;
*tail=st;
tail++;
}
}
if(tail0==tail) return 0;
else{
head++;
k++;
}
}
return 0;
}
int main(void){
int n,m,i,j,id,jd,im,jm,tx[200],ty[200],txx=0,tyy=0,min,vd,vm;
while((scanf("%d %d",&n,&m))!=EOF){
min=802;
for(i=0;i<n;i++){
scanf("%s",a[i]);
if(a[i][j]=='Y'){
id=i;
jd=j;
}
if(a[i][j]=='M'){
im=i;
jm=j;
}
if(a[i][j]=='@'){
tx[txx++]=i;
ty[tyy++]=j;
}
}
for(i=0;i<txx;i++){
vd=f(a,n,m,s,id,jd,tx[i],ty[i]);
vm=f(a,n,m,s,im,jm,tx[i],ty[i]);
printf("vd=%d,vm=%d\n",vd,vm);
if(vd!=0 && vm!=0)
min=((min>(vd+vm))?(vd+vm):min);
}
printf("%d\n",min*11);
}
return 0;
}