解题思路
给定一个 矩阵表示迷宫,其中 C 表示小A的位置,D 表示小B的的位置,# 表示不可通过的障碍,. 表示可正常通过的位置。
小A每次可以移动一个位置,移动的方向是上下左右左上左下右上右下 8 个方向;
小B每次可以移动两次位置,移动的方向是上下左右 4 个方向。
请问他们是否能够相遇,如果能,那么最早什么时候能够找到对方。
广度优先搜索:
每单位时间对小A使用一次 ,对小B使用两次 ,如果小A或小B走到了对方走过的位置,则表示相遇。
C++代码
#include<iostream> #include<vector> #include<queue> #include<memory.h> using namespace std; int N, M; int d[8][2] = {{1,0}, {-1,0}, {0,1}, {0,-1}, {1,1}, {1,-1}, {-1,1}, {-1,-1}}; queue<pair<int,int>> qa, qb; int va[1001][1001]; int vb[1001][1001]; bool bfs1(vector<vector<char>>& ground){ int k = qa.size(); while(k){ int x1 = qa.front().first; int y1 = qa.front().second; qa.pop(); for(int i=0; i<8; ++i){ int x = x1 + d[i][0]; int y = y1 + d[i][1]; if(x>=0 && x<N && y>=0 && y<M && ground[x][y]!='#' && va[x][y]==0){ qa.push(make_pair(x,y)); va[x][y] = 1; if(vb[x][y]) return true; } } --k; } return false; } bool bfs2(vector<vector<char>>& ground){ int k = qb.size(); while(k){ int x2 = qb.front().first; int y2 = qb.front().second; qb.pop(); for(int i=0; i<4; ++i){ int x = x2 + d[i][0]; int y = y2 + d[i][1]; if(x>=0 && x<N && y>=0 && y<M && ground[x][y]!='#' && vb[x][y]==0){ qb.push(make_pair(x,y)); vb[x][y] = 1; if(va[x][y]) return true; } } --k; } return false; } int main(){ cin >> N >> M; memset(va, 0, 1001); memset(vb, 0, 1001); vector<vector<char>> ground(N, vector<char>(M)); int ax, ay, bx, by; for(int i=0; i<N; ++i){ for(int j=0; j<M; ++j){ cin >> ground[i][j]; if(ground[i][j] == 'C'){ ax = i; ay = j; } if(ground[i][j] == 'D'){ bx = i; by = j; } } } va[ax][ay] = 1; vb[bx][by] = 1; qa.push(make_pair(ax,ay)); qb.push(make_pair(bx,by)); int cnt = 1; bool meet = false; while(!qa.empty() || !qb.empty()){ if(bfs1(ground)){ meet = true; break; } if(bfs2(ground)){ meet = true; break; } if(bfs2(ground)){ meet = true; break; } ++cnt; } if(meet) cout << "YES" << endl << cnt << endl; else cout << "NO" << endl; return 0; }