牛客網-鄧老師-每日一題-小A與小B-搜索

鏈接:https://ac.nowcoder.com/acm/problem/23486
來源:牛客網

題目描述
小A與小B這次兩個人都被困在了迷宮裏面的兩個不同的位置,而他們希望能夠迅速找到對方,然後再考慮如何逃離迷宮的事情。小A每次可以移動一個位置,而小B每次可以移動兩次位置,小A移動的方向是上下左右左上左下右上右下8個方向,小B移動的方向是上下左右4個方向,請問他們最早什麼時候能夠找到對方,如果他們最終無法相遇,那麼就輸出”NO"。
輸入描述:
第一行兩個整數N,M分別表示迷宮的行和列。\
接下來一個N\times M 的矩陣\其中"C"表示小A的位置,"D"表示小B的的位置,\
"#“表示不可通過的障礙,”."則是可以正常通過的位置。\字符用空格隔開\第一行兩個整數N,M分別表示迷宮的行和列。
接下來一個N×M的矩陣
其中"C"表示小A的位置,"D"表示小B的的位置,
"#“表示不可通過的障礙,”."則是可以正常通過的位置。
字符用空格隔開
輸出描述:
如果可以相遇,第一行輸出一個YES,第二行一個整數輸出最短的相遇時間。
否則就輸出一個NO表示不能相遇。
示例1
輸入
複製4 5
. . . . .
. # # # .
. . . # D
. . C # .
輸出
YES
3

題目很明顯是一道搜索問題。但是與往常的搜索問題不同的事。通常我們在使用BFS做搜索問題的時候,只在起點一端可以移動。但是這裏需要我們同時對AB兩端進行操作。可以當做兩起點的BFS。我們假設對A移動爲BFS1,對B移動爲BFS2。那麼,每一步,我們需要進行BFS1,BFS2,BFS2操作。對於兩種不同的BFS操作,可以設置VIS1,VIS2分別進行記錄,一方面是爲了該端的搜索,另一方面當我們對BFS1操作後,如果VIS2和VIS1同時被記錄那麼我們得到AB兩端相遇,即可直接輸出答案。如果走完n*m次仍然無法相遇,則永遠無法相遇。

#include<bits/stdc++.h>
#define PII pair<int, int>
#define line inline
#define reverse(s) reverse(s.begin(), s.end());
using namespace std;
const int _max = 1000+50;
int n,m,step;
int dx[] = {1,-1,0,0,1,1,-1,-1};
int dy[] = {0,0,1,-1,1,-1,1,-1};
bool vis[2][_max][_max];
char mp[_max][_max];
bool f = false;
queue<PII> q[2];
void bfs(bool k){
	int len = q[k].size();
	while(len--){
		PII now = q[k].front();
		q[k].pop();
		for(int i = 0 ; i < 4+(k == 0? 4 : 0) ; i++){
			int x = now.first + dx[i];
			int y = now.second + dy[i];
			if (x < 0 || x >= n || y < 0 || y >= m || vis[k][x][y] || mp[x][y] == '#')
				continue;
			vis[k][x][y] = true;
			q[k].push({x,y});
			if(vis[!k][x][y]){
				cout<<"YES"<<endl<<step<<endl;
				f = true;
				return ;
			}	
	
		}
	}
}
void solve(){
	cin>>n>>m;
	for(int i = 0 ; i < n ; i++)
		for(int j = 0 ; j < m ; j++){
			cin>>mp[i][j];
			if(mp[i][j] == 'C') q[0].push(make_pair(i,j)),vis[0][i][j];
			if(mp[i][j] == 'D') q[1].push(make_pair(i,j)),vis[1][i][j]; 
		} 
	step = 0;	
	while(step <= n*m){
		step++;
		bfs(0);
		if(f) return ;
		bfs(1);
		if(f) return ;
		bfs(1);
		if(f) return ;
	}
	cout<<"NO"<<endl;
}
int main(){
	solve();
	
	return 0;
} 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章