Description
Bessie loves her grass and loves to hurry to the barn for her evening milking session. She has partitioned the pasture into a rectilinear grid of R (1 <= R <= 100) rows and C (1 <= C <= 100) columns and marked the squares as grass or rocky (she can't eat rocks and won't even go into those squares). Bessie starts on her map at location R_b,C_b and wishes to munch her way, square by square, to the barn at location 1,1 by the shortest route possible. She moves from one square to any one of the potentially four adjacent squares. Below is the original map [with rocks ('*'), grass ('.'), the barn ('B'), and Bessie ('C' for cow) at row 5, col 6] and a route map with the optimal route marked with munches ('m'): Map Optimal Munched Route 1 2 3 4 5 6 <-col 1 2 3 4 5 6 <-col 1 B . . . * . 1 B m m m * . 2 . . * . . . 2 . . * m m m 3 . * * . * . 3 . * * . * m 4 . . * * * . 4 . . * * * m 5 * . . * . C 5 * . . * . m Bessie munched 9 squares. Given a map, determine how many squares Bessie will eat on her shortest route to the barn (there's no grass to eat on the barn's square).
Input
* Line 1: Two space-separated integers: R and C * Lines 2..R+1: Line i+1 describes row i with C characters (and no spaces) as described above
Output
* Line 1: A single integer that is the number of squares of grass that Bessie munches on the shortest route back to the barn
5 6 B...*. ..*... .**.*. ..***. *..*.C
9
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int inf=9999999;
typedef pair<int,int>pos;
int R,C;
char Map[105][105];//地图
int ans[105][105];//由起点到(i,j)点的最小距离&&(i,j)点不是石头
int bi,bj;//起点
int ci,cj;//终点
int X[4]={0,1,-1,0},Y[4]={1,0,0,-1};//四个方向
int BFS(){
queue<pos>que;
for(int i=0;i<R;i++)
for(int j=0;j<C;j++)
ans[i][j]=inf;
que.push(pos(bi,bj));
ans[bi][bj]=0;
while(que.size()){
pos p=que.front();
que.pop();
if(p.first==ci&&p.second==cj)
break;
for(int i=0;i<4;i++)
for(int j=0;j<4;j++){
int xn=p.first+X[i];
int yn=p.second+Y[i];
if(xn>=0&&xn<R&&yn>=0&&yn<C&&ans[xn][yn]==inf&&Map[xn][yn]!='*'){
que.push(pos(xn,yn));
ans[xn][yn]=ans[p.first][p.second]+1;
}
}
}
return ans[ci][cj];
}
int main ()
{
while(~scanf("%d%d",&R,&C)){
for(int i=0;i<R;i++)
for(int j=0;j<C;j++){
cin>>Map[i][j];
if(Map[i][j]=='B'){
bi=i;bj=j;
}
else if(Map[i][j]=='C'){
ci=i;cj=j;
}
}
printf("%d\n",BFS());
}
return 0;
}