HDU 2612 (BFS+取最優解)
1.題意:你約你喜歡的妹子去KFC,你們想找一家最近的,使得你和妹子到KFC所用時間和最短。
2.思路:相當於進行兩次BFS搜尋,可以從每個KFC當做起始點 出發搜尋Y和M,也可以從Y和M出發搜尋到達每個KFC的時間,然後用一個數組儲存到達每個kfc的總時間,找到最小值輸出即可,要記得在合適的時間初始化vis和cost陣列,要不然會出現不必要的麻煩。要注意考慮到題目中的極端情況,也就是有一家KFC距離最近,但是無法到達,所以不能夠選擇這一家,考慮到這一點之後還是能比較輕鬆的AC的
3.貼上程式碼:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <iostream>
#include <queue>
#include <string>
using namespace std;
char Map[205][205];
int vis[205][205],cost[205][205];
int mov1[4]{1,-1,0, 0};
int mov2[4]{0, 0,1,-1};
int row,col,yx,yy,mx,my,ans;
struct node{
int x,y,step;
};
int bfs(int a,int b)
{
memset(vis,0,sizeof(vis));
queue<node> way;
node start;
start.x=a;
start.y=b;
start.step=0;
way.push(start);
while(!way.empty())
{
node now=way.front();
way.pop();
int xx=now.x,yy=now.y,ss=now.step;
//cout<<xx<<" "<<yy<<" "<<ss<<endl;
for(int i=0;i<4;i++)
{
if(vis[xx+mov1[i]][yy+mov2[i]]!=1&&
xx+mov1[i]>=0&&xx+mov1[i]<row
&&yy+mov2[i]>=0&&yy+mov2[i]<col)
{
if(Map[xx+mov1[i]][yy+mov2[i]]=='#')
continue;
if(Map[xx+mov1[i]][yy+mov2[i]]=='@')
{
node newnode;
vis[xx+mov1[i]][yy+mov2[i]]=1;
newnode.x=xx+mov1[i];
newnode.y=yy+mov2[i];
newnode.step=ss+1;
way.push(newnode);
cost[xx+mov1[i]][yy+mov2[i]]+=newnode.step;
//cout<<cost[newnode.x][newnode.y]<<endl;
}
else if(Map[xx+mov1[i]][yy+mov2[i]]=='.')
{
node newnode;
vis[xx+mov1[i]][yy+mov2[i]]=1;
newnode.x=xx+mov1[i];
newnode.y=yy+mov2[i];
newnode.step=ss+1;
way.push(newnode);
}
}
}
}
int mmax=1000000;
for(int i=0;i<row;i++){
for(int j=0;j<col;j++){
if(cost[i][j]!=0&&cost[i][j]<mmax)
mmax=cost[i][j];
//cout<<cost[i][j]<<" ";
}
//cout<<endl;
}
//cout<<mmax<<endl;
return mmax;
}
int main()
{
string s;
while(~scanf("%d%d",&row,&col))
{
memset(cost,0,sizeof(cost));
ans=0;
for(int i=0;i<row;i++)
{
cin>>s;
for(int j=0;j<col;j++)
{
Map[i][j]=s[j];
if(s[j]=='Y'){
yx=i;yy=j;
}
else if(s[j]=='M'){
mx=i;my=j;
}
}
}
ans=bfs(yx,yy);
//cout<<ans<<"######"<<endl;
ans=bfs(mx,my);
//cout<<ans<<"####33"<<endl;
printf("%d\n",ans*11);
}
return 0;
}