#include<bits/stdc++.h> //
using namespace std; //
#define ll long long //
#define all(x, y) (x).begin() + 1, (x).begin() + (y) + 1 //
#define fast ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0) //
#define el cerr<<'\n'; //
#define yes cout<<"YES\n" //
#define nah cout<<"NO\n" //
#define debug(x) cerr << #x << " = " << x << '\n' //
#define sevpts main //
#define vl vector<ll> //
#define pii pair<ll, ll> //
#define FOR(i,a,b) for (int i=a; i<=b; ++i) //
#define FORD(i,a,b) for (int i=a; i>=b; --i) //
#define pb push_back //
#define fi first// __ //
#define se second// <(o )____ //
const ll MOD2 = 988244353;// ( ._> / //
const ll MOD = 1e9 + 7;// `----' //
const long long INF = 2 * 1e18; //
const ll maxn = 5e5 + 69; //
const ll maxn2 = 1e3 + 69; //
//_____________________________________________________________________//
ll n, m;
#define vcl vector< vector< vl > >
int dx[10] = {-1, 1, 0, 0};
int dy[10] = {0, 0, -1, 1};
vcl mat(105, vector< vl > (105, vl (2)));
bool valid(ll y, ll x, ll y1, ll x1, ll P, ll C, ll Z, ll N) {
bool flag1 = (1<=y1 && y1<=n && 1<=x1 && x1 <= m);
if(!flag1) return false;
ll x_offset = x1-x, y_offset = y1-y;
ll side = (x_offset!=0);
y_offset = -(y_offset < 0);
x_offset = -(x_offset < 0);
ll door_color = mat[y+y_offset][x+x_offset][side];
bool flag2 = (door_color == P|| door_color == C*2|| door_color == Z*3|| door_color == N*4);
return flag2;
}
vector< vl > vis(105, vl ( 105, 0 ));
ll ans = 0;
bool stop = false;
void dfs(ll y, ll x, ll end_y, ll end_x, ll P, ll C, ll Z, ll N) {
vis[y][x] = true;
if(x == end_x && y == end_y) {
ans = 1;
stop = true;
}
else{
FOR(i,0,3){
if(stop) break;
ll x1 = x + dx[i], y1 = y + dy[i];
if(valid(y,x,y1,x1, P, C, Z, N) && !vis[y1][x1]) {
dfs(y1,x1,end_y,end_x, P, C, Z, N);
}
}
}
}
int cur[4];
bool ok = 0;
void quaytay(ll a,ll b,ll c,ll d,ll pos, ll num) {
if(pos > 3 ) {
ans = 0;
stop = false;
FOR(i,1,n) FOR(j,1,m) vis[i][j] = 0;
dfs(a,b,c,d, cur[0], cur[1], cur[2], cur[3]);
if(ans) ok = 1;
}
else {
if(num > 0) {
cur[pos] = 1;
quaytay(a,b,c,d,pos+1,num-1);
}
cur[pos] = 0;
quaytay(a,b,c,d,pos+1,num);
}
}
ll calc(ll y, ll x, ll y1, ll x1){
// xet TH i mau duy nhat:
FOR(i,1,3) {
FOR(j,0,3) cur[j] = 0;
ok = 0;
quaytay(y,x,y1,x1,0,i);
// debug(i);
// debug(ok);
// el;
if(ok) return i;
}
return 4;
}
void sol() {
// P:1 C:2 Z:3 N:4
//mat[i][j][1] = ngang[i][j];
//mat[i][j][0] = doc[i][j];
cin >> n >> m;
string s;
FOR(i,1,n) {
cin>> s;
FOR(j,0,s.size()-1) {
ll val = 4;
if(s[j] == 'P') val = 1;
if(s[j] == 'C') val = 2;
if(s[j] == 'Z') val = 3;
mat[i][j+1][1] = val;//ngang
}
}
FOR(i,1,n-1) {
cin>> s;
FOR(j,0,s.size()-1) {
ll val = 4;
if(s[j] == 'P') val = 1;
if(s[j] == 'C') val = 2;
if(s[j] == 'Z') val = 3;
mat[i][j+1][0] = val;//doc
}
}
ll q;
cin>>q;
while(q--) {
vis = vector<vl>(105, vl(105, 0));
ll a,b,c,d;
cin >> a >> b >> c >> d;
cout<<calc(a,b,c,d)<<'\n';
}
}
signed sevpts(){
fast;
ll tt = 1;
//cin >> tt;
while(tt--)
sol();
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwp1c2luZyBuYW1lc3BhY2Ugc3RkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCiNkZWZpbmUgbGwgbG9uZyBsb25nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KI2RlZmluZSBhbGwoeCwgeSkgKHgpLmJlZ2luKCkgKyAxLCAoeCkuYmVnaW4oKSArICh5KSArIDEgICAgICAgICAgICAgICAvLwojZGVmaW5lIGZhc3QgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSksIGNpbi50aWUoMCksIGNvdXQudGllKDApIC8vCiNkZWZpbmUgZWwgY2Vycjw8J1xuJzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KI2RlZmluZSB5ZXMgY291dDw8IllFU1xuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwojZGVmaW5lIG5haCBjb3V0PDwiTk9cbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCiNkZWZpbmUgZGVidWcoeCkgY2VyciA8PCAjeCA8PCAiID0gIiA8PCB4IDw8ICdcbicgICAgICAgICAgICAgICAgICAgICAgLy8KI2RlZmluZSBzZXZwdHMgbWFpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwojZGVmaW5lIHZsIHZlY3RvcjxsbD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCiNkZWZpbmUgcGlpIHBhaXI8bGwsIGxsPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KI2RlZmluZSBGT1IoaSxhLGIpICBmb3IgKGludCBpPWE7IGk8PWI7ICsraSkgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwojZGVmaW5lIEZPUkQoaSxhLGIpIGZvciAoaW50IGk9YTsgaT49YjsgLS1pKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCiNkZWZpbmUgcGIgcHVzaF9iYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KI2RlZmluZSBmaSBmaXJzdC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fICAgICAgICAgICAgICAgICAgICAvLwojZGVmaW5lIHNlIHNlY29uZC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwobyApX19fXyAgICAgICAgICAgICAgIC8vCmNvbnN0IGxsIE1PRDIgPSA5ODgyNDQzNTM7Ly8gICAgICAgICAgICAgICAgICAgICggIC5fPiAvICAgICAgICAgICAgICAgLy8KY29uc3QgbGwgTU9EID0gMWU5ICsgNzsvLyAgICAgICAgICAgICAgICAgICAgICAgIGAtLS0tJyAgICAgICAgICAgICAgICAvLwpjb25zdCBsb25nIGxvbmcgSU5GID0gMiAqIDFlMTg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCmNvbnN0IGxsIG1heG4gPSA1ZTUgKyA2OTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KY29uc3QgbGwgbWF4bjIgPSAxZTMgKyA2OTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXy8vCmxsIG4sICBtOwojZGVmaW5lIHZjbCB2ZWN0b3I8IHZlY3RvcjwgdmwgPiA+CmludCBkeFsxMF0gPSB7LTEsIDEsIDAsIDB9OwppbnQgZHlbMTBdID0gezAsIDAsIC0xLCAxfTsKdmNsIG1hdCgxMDUsIHZlY3RvcjwgdmwgPiAoMTA1LCB2bCAoMikpKTsKYm9vbCB2YWxpZChsbCB5LCBsbCB4LCBsbCB5MSwgbGwgeDEsIGxsIFAsIGxsIEMsIGxsIFosIGxsIE4pIHsKICAgIGJvb2wgZmxhZzEgPSAoMTw9eTEgJiYgeTE8PW4gJiYgMTw9eDEgJiYgeDEgPD0gbSk7CiAgICBpZighZmxhZzEpIHJldHVybiBmYWxzZTsKICAgIGxsIHhfb2Zmc2V0ID0geDEteCwgeV9vZmZzZXQgPSB5MS15OwogICAgCiAgICBsbCBzaWRlID0gKHhfb2Zmc2V0IT0wKTsKICAgIHlfb2Zmc2V0ID0gLSh5X29mZnNldCA8IDApOwogICAgeF9vZmZzZXQgPSAtKHhfb2Zmc2V0IDwgMCk7CiAgICBsbCBkb29yX2NvbG9yID0gbWF0W3kreV9vZmZzZXRdW3greF9vZmZzZXRdW3NpZGVdOwogICAgYm9vbCBmbGFnMiA9IChkb29yX2NvbG9yID09IFB8fCBkb29yX2NvbG9yID09IEMqMnx8IGRvb3JfY29sb3IgPT0gWiozfHwgZG9vcl9jb2xvciA9PSBOKjQpOwogICAgcmV0dXJuIGZsYWcyOwp9Cgp2ZWN0b3I8IHZsID4gdmlzKDEwNSwgdmwgKCAxMDUsIDAgKSk7CmxsIGFucyA9IDA7CmJvb2wgc3RvcCA9IGZhbHNlOwp2b2lkIGRmcyhsbCB5LCBsbCB4LCBsbCBlbmRfeSwgbGwgZW5kX3gsIGxsIFAsIGxsIEMsIGxsIFosIGxsIE4pIHsKICAgIHZpc1t5XVt4XSA9IHRydWU7CiAgICBpZih4ID09IGVuZF94ICYmIHkgPT0gZW5kX3kpIHsKICAgICAgICBhbnMgPSAxOwogICAgICAgIHN0b3AgPSB0cnVlOwogICAgfQogICAgZWxzZXsKICAgICAgICBGT1IoaSwwLDMpewogICAgICAgICAgICBpZihzdG9wKSBicmVhazsKICAgICAgICAgICAgbGwgeDEgPSB4ICsgZHhbaV0sIHkxID0geSArIGR5W2ldOwogICAgICAgICAgICBpZih2YWxpZCh5LHgseTEseDEsIFAsIEMsIFosIE4pICYmICF2aXNbeTFdW3gxXSkgewogICAgICAgICAgICAgICAgZGZzKHkxLHgxLGVuZF95LGVuZF94LCBQLCBDLCBaLCBOKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KfQppbnQgY3VyWzRdOwpib29sIG9rID0gMDsKdm9pZCBxdWF5dGF5KGxsIGEsbGwgYixsbCBjLGxsIGQsbGwgcG9zLCBsbCBudW0pIHsKICAgIGlmKHBvcyA+IDMgKSB7CiAgICAgICAgYW5zID0gMDsKICAgICAgICBzdG9wID0gZmFsc2U7CiAgICAgICAgRk9SKGksMSxuKSBGT1IoaiwxLG0pIHZpc1tpXVtqXSA9IDA7CiAgICAgICAgZGZzKGEsYixjLGQsIGN1clswXSwgY3VyWzFdLCBjdXJbMl0sIGN1clszXSk7CiAgICAgICAgaWYoYW5zKSBvayA9ICAxOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgaWYobnVtID4gMCkgewogICAgICAgICAgICBjdXJbcG9zXSA9IDE7CiAgICAgICAgICAgIHF1YXl0YXkoYSxiLGMsZCxwb3MrMSxudW0tMSk7CiAgICAgICAgfQogICAgICAgIGN1cltwb3NdID0gMDsKICAgICAgICBxdWF5dGF5KGEsYixjLGQscG9zKzEsbnVtKTsKCiAgICB9Cn0KbGwgY2FsYyhsbCB5LCBsbCB4LCBsbCB5MSwgbGwgeDEpewogICAgLy8geGV0IFRIIGkgbWF1IGR1eSBuaGF0OgogICAgRk9SKGksMSwzKSB7CiAgICAgICAgRk9SKGosMCwzKSBjdXJbal0gPSAwOwogICAgICAgIG9rID0gMDsKICAgICAgICBxdWF5dGF5KHkseCx5MSx4MSwwLGkpOwogICAgICAgIC8vIGRlYnVnKGkpOwogICAgICAgIC8vIGRlYnVnKG9rKTsKICAgICAgICAvLyBlbDsKICAgICAgICBpZihvaykgcmV0dXJuIGk7CiAgICB9CiAgICByZXR1cm4gNDsKCn0KCgp2b2lkIHNvbCgpIHsKICAgIC8vIFA6MSBDOjIgWjozIE46NAogICAgLy9tYXRbaV1bal1bMV0gPSBuZ2FuZ1tpXVtqXTsKICAgIC8vbWF0W2ldW2pdWzBdID0gZG9jW2ldW2pdOwoKICAgIGNpbiA+PiBuID4+IG07CiAgICBzdHJpbmcgczsKICAgIEZPUihpLDEsbikgewogICAgICAgIGNpbj4+IHM7CiAgICAgICAgRk9SKGosMCxzLnNpemUoKS0xKSB7CiAgICAgICAgICAgIGxsIHZhbCA9IDQ7CiAgICAgICAgICAgIGlmKHNbal0gPT0gJ1AnKSB2YWwgPSAxOwogICAgICAgICAgICBpZihzW2pdID09ICdDJykgdmFsID0gMjsKICAgICAgICAgICAgaWYoc1tqXSA9PSAnWicpIHZhbCA9IDM7CiAgICAgICAgICAgIG1hdFtpXVtqKzFdWzFdID0gdmFsOy8vbmdhbmcKICAgICAgICB9CiAgICB9CiAgICBGT1IoaSwxLG4tMSkgewogICAgICAgIGNpbj4+IHM7CiAgICAgICAgRk9SKGosMCxzLnNpemUoKS0xKSB7CiAgICAgICAgICAgIGxsIHZhbCA9IDQ7CiAgICAgICAgICAgIGlmKHNbal0gPT0gJ1AnKSB2YWwgPSAxOwogICAgICAgICAgICBpZihzW2pdID09ICdDJykgdmFsID0gMjsKICAgICAgICAgICAgaWYoc1tqXSA9PSAnWicpIHZhbCA9IDM7CiAgICAgICAgICAgIG1hdFtpXVtqKzFdWzBdID0gdmFsOy8vZG9jCiAgICAgICAgfQogICAgfQoKICAgIGxsIHE7CiAgICBjaW4+PnE7CiAgICB3aGlsZShxLS0pIHsKICAgICAgICB2aXMgPSB2ZWN0b3I8dmw+KDEwNSwgdmwoMTA1LCAwKSk7CiAgICAgICAgbGwgYSxiLGMsZDsKICAgICAgICBjaW4gPj4gYSA+PiBiID4+IGMgPj4gZDsKICAgICAgICBjb3V0PDxjYWxjKGEsYixjLGQpPDwnXG4nOwogICAgfQp9CgpzaWduZWQgc2V2cHRzKCl7CiAgICBmYXN0OwogICAgbGwgdHQgPSAxOwogICAgLy9jaW4gPj4gdHQ7CiAgICB3aGlsZSh0dC0tKQogICAgc29sKCk7CiAgICByZXR1cm4gMDsKfQoK