hdu 2612 Find a way
这是一题广搜题,但是结果却是测试样例过了但是提交却是WA,求大神请教!!!
‘Y’ 代表Y的位置
‘M’ 代表M的位置
‘#’ 代表墙
‘.’ 代表路
‘@’ 代表KCF
找出一条路使得Y和M走到KFC的时间最短(Y和M每走一步耗时11分钟),输出最短时间。
下面是代码:
#include<iostream>
#include<queue>
#include<stdio.h>
#include<string.h>
using namespace std;
int n,m;
int yx,yy;
int mx,my;
int dir[4][2]={0,1,0,-1,1,0,-1,0};
int map[210][210];
int KFC[210][3];
int Knum=0;
int time;
int tt;
queue<int>pointx;
queue<int>pointy;
bool isin(int x,int y)
{
return x>=0&&y>=0&&x<n&&y<m;
}
void bfs(int x,int y)
{
pointx.pop();
pointy.pop();
for(int i=0;i<Knum;i++)
{
if(x==KFC[i][0]&&y==KFC[i][1])
{
KFC[i][2]+=map[x][y]; //记录一个人走到一个KFC所需的时间
tt++;
}
}
if(tt==Knum)
{
map[x][y]=0;
return;
}
int x1,y1,z1;
for(int i=0;i<4;i++) //向四个方向搜索
{
x1=x+dir[i][0];
y1=y+dir[i][1];
if(isin(x1,y1)==true&&map[x1][y1]==0) //达到条件在地图中且未搜索过,则标记并压入队列
{
map[x1][y1]=map[x][y]+1;
pointx.push(x1);
pointy.push(y1);
}
}
if(!pointx.empty()&&!pointy.empty()) //如果队列未空,则继续头元素搜索
bfs(pointx.front(),pointy.front());
map[x][y]=0;
return;
}
int main()
{
char x;
while(cin>>n>>m)
{
memset(map,0,sizeof(map));
memset(KFC,0,sizeof(KFC));
Knum=0;
time=2000000000;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
cin>>x;
if(x=='#')map[i][j]=-1;
else if(x=='.')map[i][j]=0;
else if(x=='Y')
{
map[i][j]=1;
yx=i;
yy=j;
}
else if(x=='M')
{
map[i][j]=1;
mx=i;
my=j;
}
else if(x=='@')
{
map[i][j]=0;
KFC[Knum][0]=i;
KFC[Knum][1]=j;
KFC[Knum][2]=0;
Knum++;
}
}
tt=0; //Y先走
pointx.push(yx);
pointy.push(yy);
bfs(pointx.front(),pointy.front());
while(!pointx.empty()) //清空队列
{
map[pointx.front()][pointy.front()]=0;
pointx.pop();
pointy.pop();
}
tt=0; //M后走
pointx.push(mx);
pointy.push(my);
bfs(pointx.front(),pointy.front());
while(!pointx.empty()) //清空队列
{
pointx.pop();
pointy.pop();
}
for(int i=0;i<Knum;i++)
{
if(KFC[i][2]-2<time)
{
time=KFC[i][2]-2;
}
}
cout<<time*11<<endl;
}
}