一上午都在跟这个题较劲,最后终于做出来了。
刚开始我对每一个KFC进行搜索,当时心里想着这铁定是要超时的。。。。结果还真不出我所料。
然后我对Y和M进行搜索,对搜索到的每一个KFC店进行标记,最后将每一个KFC店所需要花费的两个人的时间逐个相加,求出其中最小值。
可能因为昨天是周五,宿舍一晚上都在打游戏,我也没法睡觉,今天状态特别不好,各种鸡毛蒜皮的bug浪费我了很多时间。
最后,这道题有两个需要注意的地方,一个是这些KFC店可能只有其中一个人能够到达,另一个是两个人到达一个KFC店时未必要停下来,应该是不能停下来,继续遍历下面的点,这两个KFC的状态也应该加入队列。
好蛋疼啊。代码轰轰烈烈地写了快二百行。觉得自己太二了。
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
#define N 405
#define MAX 99999999
#define T 9999999
int map[N][N],mapt[N][N];
int ans1[N],ans2[N];
int dir[4][2]={1,0, -1,0, 0,1, 0,-1};
int m,n,k;
int a,b;
int x,y;
struct node
{
int x,y;
int step;
};
void value()
{
int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
mapt[i][j]=map[i][j];
}
}
}
void value1()
{
int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(mapt[i][j]!=0&&mapt[i][j]!=MAX&&mapt[i][j]!=T)
map[i][j]=mapt[i][j];
}
}
}
int judge(int x,int y)
{
if(x>=0&&x<m&&y>=0&&y<n&&(mapt[x][y]==0||mapt[x][y]==MAX))
return 1;
return 0;
}
int judge1(int x,int y)
{
if(x>=0&&x<m&&y>=0&&y<n&&map[x][y]!=T)
return 1;
return 0;
}
void bfs(int a,int b)
{
int i,x,y;
queue<node>q;
node cur,next;
cur.x=a;
cur.y=b;
cur.step=0;
mapt[a][b]=T;
q.push(cur);
k=1;
while(!q.empty())
{
cur=q.front();
q.pop();
next.step=cur.step+1;
for(i=0;i<4;i++)
{
next.x=x=cur.x+dir[i][0];
next.y=y=cur.y+dir[i][1];
if(judge(x,y)==1)
{
if(mapt[x][y]==MAX)
{
ans1[k]=next.step;
mapt[x][y]=k;
k++;
q.push(next);
}
else
{
mapt[x][y]=T;
q.push(next);
}
}
}
}
return ;
}
void bfs1(int a,int b)
{
int i,x,y;
queue<node>q;
node cur,next;
cur.x=a;
cur.y=b;
cur.step=0;
map[a][b]=T;
q.push(cur);
while(!q.empty())
{
cur=q.front();
q.pop();
next.step=cur.step+1;
for(i=0;i<4;i++)
{
next.x=x=cur.x+dir[i][0];
next.y=y=cur.y+dir[i][1];
if(judge1(x,y)==1)
{
if(map[x][y]!=0)
{
ans2[map[x][y]]=next.step;
q.push(next);
}
else
{
q.push(next);
}
map[x][y]=T;
}
}
}
return ;
}
int main()
{
int i,j;
char c;
int temp,min;
while(scanf("%d%d",&m,&n)!=EOF)
{
memset(map,0,sizeof(map));
memset(mapt,0,sizeof(mapt));
for(i=0;i<m;i++)
{
getchar();
for(j=0;j<n;j++)
{
scanf("%c",&c);
if(c=='Y')
{
a=i;
b=j;
}
else if(c=='M')
{
x=i;
y=j;
}
else if(c=='#')
map[i][j]=T;
else if(c=='@')
map[i][j]=MAX;
}
}
memset(ans1,0,sizeof(ans1));
memset(ans2,0,sizeof(ans2));
value();
bfs(a,b);
value1();
bfs1(x,y);
min=MAX;
for(i=1;i<k;i++)
{
if(ans1[i]==0||ans2[i]==0)
continue;
else
temp=ans1[i]+ans2[i];
if(temp<min)
min=temp;
}
printf("%d\n",min*11);
}
return 0;
}