Find a way (BFS)
Find a way
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<queue> 6 using namespace std; 7 8 char map[201][201]; 9 int book1[205][205],book2[205][205]; 10 int step1[205][205],step2[205][205]; 11 int dir[4][2]={ {1,0},{0,1},{-1,0},{0,-1} }; 12 int n,m,x1,y1,x2,y2; 13 14 struct note 15 { 16 int x; 17 int y; 18 int s; 19 }a,b; 20 queue<note>q; 21 22 void bfs1(int xx,int yy) 23 { 24 memset(book1,0,sizeof(book1)); 25 while(!q.empty()) //清空 26 q.pop(); 27 a.x= xx; 28 a.y= yy; 29 a.s= 0 ; 30 book1[a.x][a.y]=1; 31 step1[a.x][a.y]=0; 32 q.push(a); 33 while(!q.empty()) 34 { 35 a=q.front(); 36 q.pop();//及时出队 37 for(int i=0;i<4;i++) 38 { 39 b.x=a.x+dir[i][0]; 40 b.y=a.y+dir[i][1]; 41 if(map[b.x][b.y]=='#'|| 42 book1[b.x][b.y]==1|| 43 b.x<1||b.x>n||b.y<1||b.y>m) 44 continue; 45 book1[b.x][b.y]=1; //标记:走过了 46 b.s=a.s+11; 47 step1[b.x][b.y]=b.s; //记录到每个位置的步数 48 q.push(b); //入队 49 } 50 } 51 return; 52 } 53 54 void bfs2(int xx,int yy) 55 { 56 memset(book2,0,sizeof(book2)); 57 while(!q.empty()) 58 q.pop(); 59 a.x= xx; 60 a.y= yy; 61 a.s= 0 ; 62 book2[a.x][a.y]=1; 63 step2[a.x][a.y]=0; 64 q.push(a); 65 while(!q.empty()) 66 { 67 a=q.front(); 68 q.pop(); 69 for(int i=0;i<4;i++) 70 { 71 b.x=a.x+dir[i][0]; 72 b.y=a.y+dir[i][1]; 73 if(map[b.x][b.y]=='#'|| 74 book2[b.x][b.y]==1|| 75 b.x<1||b.x>n||b.y<1||b.y>m) 76 continue; 77 book2[b.x][b.y]=1; 78 b.s=a.s+11; 79 step2[b.x][b.y]=b.s; 80 q.push(b); 81 } 82 } 83 return; 84 } 85 86 int main() 87 { 88 while(cin>>n>>m) 89 { 90 for(int i=1;i<=n;i++) 91 { 92 for(int j=1;j<=m;j++) 93 { 94 cin>>map[i][j]; 95 if(map[i][j]=='Y') 96 { 97 x1=i; y1=j; 98 } 99 else if(map[i][j]=='M') 100 { 101 x2=i; y2=j; 102 } 103 } 104 } 105 106 bfs1(x1,y1); 107 bfs2(x2,y2); 108 109 int minn=0x3f3f3f3f; 110 for(int i=1;i<=n;i++) 111 { 112 for(int j=1;j<=m;j++) 113 { 114 if(map[i][j]=='@'&&book1[i][j]==1&&book2[i][j]==1) //这里一定要book检查(因为可能有人无法到达 @的地方 115 minn=min( minn, step1[i][j]+step2[i][j]); 116 } 117 } 118 cout<<minn<<endl; 119 } 120 }