标签:sam each tom 相加 pass size names let char
思路:两次BFS存下对每个kfc的最短距离,之后两两相加取min
代码:
1 #include "cstdio" 2 #include "stdlib.h" 3 #include "iostream" 4 #include "algorithm" 5 #include "string" 6 #include "cstring" 7 #include "queue" 8 #include "cmath" 9 #include "vector" 10 #include "map" 11 #include "set" 12 #define mj 13 #define db double 14 #define ll long long 15 using namespace std; 16 const int N=1e8+2; 17 const int mod=1e9+7; 18 //const ll inf=1e16+10; 19 #define inf 0x3f3f3f 20 typedef pair<int,int> P; 21 int n,m; 22 char s[300][300]; 23 int d[300][300],k[205][205]; 24 int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1}; 25 int t[2][205*205]; 26 int bfs(int sx,int sy,int id) 27 { 28 queue<P> q; 29 for(int i=0;i<205;i++){ 30 for(int j=0;j<205;j++){ 31 d[i][j]=N; 32 } 33 } 34 q.push(P(sx,sy)); 35 d[sx][sy]=0; 36 while(q.size()){ 37 P p; 38 p=q.front(),q.pop(); 39 for(int i=0;i<4;i++){ 40 int nx=p.first+dx[i],ny=p.second+dy[i]; 41 if(0<=nx&&nx<n&&0<=ny&&ny<m&&s[nx][ny]!=‘#‘&&d[nx][ny]==N){ 42 d[nx][ny]=d[p.first][p.second]+1; 43 if(s[nx][ny]==‘@‘) t[id][k[nx][ny]]=d[nx][ny];//到该点的距离 44 q.push(P(nx,ny)); 45 } 46 } 47 } 48 return 0; 49 } 50 int main() 51 { 52 int xx[3],yy[3]; 53 while(scanf("%d%d",&n,&m)==2){ 54 memset(t,inf, sizeof(t)); 55 int c=0,cnt=0,ma=N; 56 for(int i=0;i<n;i++){ 57 scanf("%s",s[i]); 58 for(int j=0;j<m;j++){ 59 if(s[i][j]==‘Y‘) xx[c]=i,yy[c++]=j; 60 else if(s[i][j]==‘M‘) xx[c]=i,yy[c++]=j; 61 else if(s[i][j]==‘@‘){ 62 k[i][j]=cnt++; 63 } 64 } 65 } 66 bfs(xx[0],yy[0],0),bfs(xx[1],yy[1],1); 67 for(int i=0;i<cnt;i++){ 68 ma=min(t[0][i]+t[1][i],ma); 69 // printf("%d %d\n",t[0][i],t[1][i]); 70 } 71 printf("%d\n",11*ma); 72 } 73 return 0; 74 }
标签:sam each tom 相加 pass size names let char
原文地址:http://www.cnblogs.com/mj-liylho/p/7190577.html