zcmu1342: Встречаются две полуночи

Ссылка на заголовок: https://acm.zcmu.edu.cn/JudgeOnline/problem.php?id=1342

Тема

Два рыцаря могут ходить только по квадрату, они ходят одновременно по плоскости длиной n и шириной m и спрашивают, могут ли они встретиться.

Самолет содержит три элемента: «.» «#» «K», точка указывает на хорошую ровную поверхность, знак фунта указывает на плохую плоскую поверхность, а K указывает на рыцаря.

Идеи

Запустите два bfs и запишите количество шагов, необходимых двум рыцарям для достижения плоскости ij. Если у них нет перекрывающихся областей, они точно не встретятся.

Тогда, если двое могут дойти до этой плоской земли, это не значит, что они встретятся. Также может быть случай, когда передняя нога выходит, а задняя входит.

Следовательно, необходимо судить, является ли разница в количестве шагов, сделанных двумя рыцарями до этой земли, четным числом. Если это четное число, то быстрый рыцарь может бегать вперед и назад, и они всегда будут встречаться .

Вы также можете гулять по плохой земле!

код переменного тока

#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