Submission
Status:
PPPPPPPPPPP
Subtask/Task Score:
100/100
Score: 100
User: kavin8888
Problemset: ต่อท่อน้ำเลี้ยง
Language: cpp
Time: 0.067 second
Submitted On: 2025-12-13 14:09:04
#include<bits/stdc++.h>
using namespace std;
int n,m,t,pudis=0;
vector<vector<int>> board;
vector<vector<int>> vis;
tuple<int,int,int,int> DI[4] = {{-1,0,2,1},{1,0,0,4},{0,-1,1,8},{0,1,3,2}};
bool valid(int x,int y) {
return 0<=x && x<n && 0<=y && y<m;
}
int turn16to10(char x) {
if(isdigit(x)) return x-'0';
else return toupper(x)-'A'+10;
}
int main() {
ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
cin>>n>>m;
board.assign(n,vector<int>(m));
vis.assign(n,vector<int>(m,-1));
for(int i=0;i<n;++i) {
string s; cin>>s;
for(int j=0;j<m;++j) {
board[i][j]=turn16to10(s[j]);
}
}
for(int i=0;i<n;++i) {
for(int j=0;j<m;++j) {
if(vis[i][j]!=-1) continue;
queue<pair<int,int>> q;
q.push({i,j});
vis[i][j]=pudis;
while(!q.empty()) {
auto [x,y]=q.front(); q.pop();
for(int cnt=0;cnt<4;cnt++) {
auto [nx,ny,nz,nbit]=DI[cnt];
int new_x=x+nx,new_y=y+ny;
if(!valid(new_x,new_y) || vis[new_x][new_y]!=-1) continue;
int pu=nbit,dis=(1<<nz);
if((board[x][y]&pu) && (board[new_x][new_y]&dis)) {
vis[new_x][new_y]=pudis;
q.push({new_x,new_y});
}
}
}
pudis++;
}
}
cin>>t;
while(t--) {
int start_x,start_y,end_x,end_y;
cin>>start_x>>start_y>>end_x>>end_y;
if(vis[start_x][start_y]==vis[end_x][end_y]) cout<<"Y\n";
else cout<<"N\n";
}
return 0;
}