题解
2024-09-29 18:07:46
发布于:上海
11阅读
0回复
0点赞
思路:
先判断基本情况,再用写。
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
struct sheep{
int x , y , t , tt;
}t;
int n , m , h[1001][1001] , q , a1 , b1 , a2 , b2 , dx[4] = {0 , 1 , 0 , -1} , dy[4] = {1 , 0 , -1 , 0};
bool vis[1001][1001][3] , f;
queue <sheep> sq;
bool bfs(){
sq.push({a1 , b1 , -1 , -1});
vis[a1][b1][0] = 1;
while (sq.size()){
t = sq.front();
sq.pop();
if (t.x == a2 && t.y == b2){
return 1;
}
for (int i = 0 , nx , ny ; i < 4 ; i++){
nx = t.x + dx[i];
ny = t.y + dy[i];
if (nx > 0 && nx <= n && ny > 0 && ny <= m && (!h[nx][ny] || h[nx][ny] == h[a2][b2]) && !vis[nx][ny][t.t]){
if (i == t.tt){
sq.push({nx , ny , t.t , t.tt});
}else if (t.t < 2){
sq.push({nx , ny , t.t + 1 , i});
}
}
}
}
return 0;
}
int main(){
while (1){
scanf("%d%d" , &n , &m);
if (!n && !m){
return 0;
}
for (int i = 1 ; i <= n ; i++){
for (int j = 1 ; j <= m ; j++){
scanf("%d" , &h[i][j]);
}
}
scanf("%d" , &q);
while (q--){
scanf("%d%d%d%d" , &a1 , &b1 , &a2 , &b2);
if (h[a1][b1] && h[a2][b2] && h[a1][b1] == h[a2][b2] && bfs()){
printf("YES\n");
}else{
printf("NO\n");
}
f = 0;
memset(vis , 0 , sizeof(vis));
}
memset(h , 0 , sizeof(h));
}
}
这里空空如也
有帮助,赞一个