제목 링크 : https://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=1342
이야기
두 명의 기사가 정사각형 패턴으로 만 걸을 수 있으며 길이 n과 너비 m의 평면을 동시에 걸 으며 만날 수 있는지 묻습니다.
비행기에는 세 가지 요소가 있습니다. "." "#" "K", 점은 좋은 평지, 파운드 기호는 나쁜 평지, K는 기사를 나타냅니다.
아이디어
두 개의 BF를 실행 하고 두 기사가 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;
}