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;
}