zcmu1342 : 두 세미 나이트가 만나다

제목 링크 : 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;
}

 

추천

출처blog.csdn.net/weixin_43911947/article/details/113335440