Submission

Status:
PPPPPPPPPPP

Score: 100

User: Monasm

Problemset: ต่อท่อน้ำเลี้ยง

Language: cpp

Time: 0.404 second

Submitted On: 2024-11-13 01:36:16

#include <bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
int gy[] = {0,1,0,-1};
int gx[] = {-1,0,1,0};

int find(vector<int> &p,int x){
    if (p[x]!=x)p[x]=find(p,p[x]); 
    return p[x];
}

void super_por(vector<int> &p,int a,int b){
    a=find(p,a);
    b=find(p,b);
    if(a!=b)p[a]=b;
}

int main() {
    int n,m;cin>>n>>m;
    int adj[n][m],vis[n][m];
    vector<int> p(n*m);
    for(int i=0;i<n*m;i++){
        p[i]=i;
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            char c;cin >> c;
            int x = c;
            x = x>='A'?x-'A'+10:x-'0';
            adj[i][j] = x;
            vis[i][j] = 0;
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(!vis[i][j]){
                vis[i][j] = 1;
                queue<pii> q;
                q.push({i,j});
                while(!q.empty()){
                    int nx = q.front().first;
                    int ny = q.front().second;
                    q.pop();
                    vis[nx][ny] = 1;
                    int ox = adj[nx][ny],a[4];
                    for(int k=0;k<4;k++){
                        a[k] = (ox&1);
                        ox=(ox>>1);
                        if(a[k]){
                            int x = nx+gx[k];
                            int y = ny+gy[k];
                            if(!(0<=x&&x<n&&0<=y&&y<m)){
                                continue;
                            }
                            int b[4],oy = adj[x][y];
                            for(int l=0;l<4;l++){
                                b[l] = (oy&1);
                                oy=(oy>>1);
                            }
                            if(b[(k+2)%4]==a[k]&&vis[x][y]==0){
                                vis[x][y] = 1;
                                super_por(p,(m*nx)+ny,(m*x)+y);
                                q.push({x,y});
                            }
                        }
                    }
                }
            }
        }
    }
    for(int i=0;i<n*m;i++){
        find(p,i);
    }
    int t;cin >> t;
    while(t--){
        int a,b,c,d;cin>>a>>b>>c>>d;
        if(find(p,(m*a)+b)==find(p,(m*c)+d)){
            cout<<"Y"<<endl;
        }
        else{
            cout<<"N"<<endl;
        }
    }
}