タイトルリンク:https://acm.zcmu.edu.cn/JudgeOnline/problem.php?id = 1342
トピック
二人の騎士は正方形のパターンでしか歩くことができず、長さn、幅mの平面を同時に歩き、会えるかどうか尋ねます。
平面には3つの要素が含まれています: "。" "#" "K"、ドットは良い平らな地面を示し、ポンド記号は悪い平らな地面を示し、Kは騎士を示します。
アイデア
2つのbfsを実行し、2人の騎士がij平面に到達するために必要なステップ数を記録します。重複する領域がない場合、それらは確実に一致しません。
そして、二人がこの平らな地面まで歩くことができれば、彼らが出会うという意味ではありません。前足が出て、後足が入る場合もあります。
そのため、二人の騎士がこの土地にたどり着くまでの歩数の差が偶数かどうかを判断する必要があります。偶数の場合、速い騎士は前後に走ることができ、常に出会うことができます。 。
悪い土地を歩くこともできます!
ACコード
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ok(x, y) x >= 1 && x <= 8 && y >= 1 && y <= 8
int dx[] = {-2, -2, 2, 2};
int dy[] = {-2, 2, -2, 2};
int dep1[15][15], dep2[15][15];
char a[15][15];
struct node{
int x, y;
};
void bfs1(int x, int y){
queue<node> q;
q.push({x, y});
dep1[x][y] = 0;
while(q.size()){
node tt = q.front(); q.pop();
for(int i = 0; i < 4; i ++){
int tx = tt.x + dx[i];
int ty = tt.y + dy[i];
if(ok(tx, ty) && dep1[tt.x][tt.y] + 1 < dep1[tx][ty]){
dep1[tx][ty] = dep1[tt.x][tt.y] + 1;
q.push({tx, ty});
}
}
}
}
bool bfs2(int x, int y){
queue<node> q;
q.push({x, y});
dep2[x][y] = 0;
while(q.size()){
node tt = q.front(); q.pop();
if(dep1[tt.x][tt.y] != 0x3f3f3f3f && (dep1[tt.x][tt.y] - dep2[tt.x][tt.y]) % 2 == 0){
return true;
}
for(int i = 0; i < 4; i ++){
int tx = tt.x + dx[i];
int ty = tt.y + dy[i];
if(ok(tx, ty) && dep2[tt.x][tt.y] + 1 < dep2[tx][ty]){
dep2[tx][ty] = dep2[tt.x][tt.y] + 1;
q.push({tx, ty});
}
}
}
return false;
}
int main(){
int t; scanf("%d", &t);
while(t --){
vector<node> k;
memset(dep1, 0x3f3f3f3f, sizeof(dep1));
memset(dep2, 0x3f3f3f3f, sizeof(dep2));
for(int i = 1; i <= 8; i ++){
scanf("%s", a[i] + 1);
for(int j = 1; j <= 8; j ++){
if(a[i][j] == 'K') k.push_back({i, j});
}
}
queue<node> q;
int x, y, flag = 0;
x = k[0].x, y = k[0].y;
bfs1(x, y);
x = k[1].x, y = k[1].y;
if(bfs2(x, y)) puts("YES");
else puts("NO");
}
return 0;
}