/**
* (1)姹傚悇鐐瑰埌婧愮偣鐨勬渶灝忔鏁幫紙BFS錛?br> * (2)姹傚悇鐐瑰埌緇堢偣鐨勬渶灝忔鏁幫紙BFS錛?br> * (3)濡傛灉鐐逛笉鏄粰瀹氳礬寰勪笂鐨勭偣錛岄偅涔堬細(xì)璇ョ偣鍒版簮鐐圭殑鏈灝忔鏁幫紜璇ョ偣鍒扮粓鐐圭殑鏈灝忔鏁?lt;緇欏畾璺緞鐨勬鏁幫紝鍚﹀垯緇欏畾璺緞涓嶆槸鍞竴鏈鐭殑
* (4)濡傛灉涓ょ浉閭?cè)潅筧銆乥涔嬮棿瀛樺湪澧欙紝閭d箞錛歛鍒版簮鐐圭殑鏈灝忔鏁幫紜1錛媌鍒扮粓鐐圭殑鏈灝忔鏁?lt;=緇欏畾璺緞鐨勬鏁?br> * 鎴栬?nbsp;a鍒扮粓鐐圭殑鏈灝忔鏁幫紜1錛媌鍒版簮鐐圭殑鏈灝忔鏁?lt;=緇欏畾璺緞鐨勬鏁幫紝鍚﹀垯澧欏浣?br> * (5)濡傛灉瀛樺湪鐐逛笉鍙揪錛岃鏄庡瓨鍦ㄥ灝嗚鐐瑰皝闂搗鏉ワ紝鍙互璇佹槑澧欒嚦灝戞湁涓鍧楀浣?br> */
#include <iostream>
#include <string>
#include <queue>
using namespace std;
struct Grid
{
bool inpath; // 鏄惁鏄礬寰勬柟鏍?/span>
bool uwal; // 鏄惁鏈変笂澧?/span>
bool rwal; // 鏄惁鏈夊彸澧?/span>
int scnt; // 鍒版簮鐐規(guī)鏁?/span>
int dcnt; // 鍒扮粓鐐規(guī)鏁?/span>
};
int main(int argc, char** argv)
{
bool ok;
int w, h, cnt, steps; // 1 <= w, h <= 100
string path;
Grid grid[100][100];
queue<pair<int, int> > q;
int t, x, y, desx, desy, x2, y2, i;
for (cin >> t; t > 0; --t)
{
// 鍒濆鍖栨暟鎹?/span>
cin >> w >> h;
for (y = 0; y < h; ++y)
for (x = 0; x < w; ++x)
{
grid[y][x].inpath = false;
grid[y][x].uwal = false;
grid[y][x].rwal = false;
grid[y][x].scnt = -1;
grid[y][x].dcnt = -1;
}
cin >> path;
x = 0, y = 0;
grid[0][0].inpath = true;
steps = path.size();
for (i = 0; i < steps; ++i)
{
switch(path[i])
{
case 'U': ++y; break;
case 'D': --y; break;
case 'L': --x; break;
case 'R': ++x; break;
}
grid[y][x].inpath = true;
}
desx = x, desy = y;
cin >> cnt;
for (i = 0; i < cnt; ++i)
{
cin >> x >> y >> x2 >> y2;
if (x == x2)
if (y + 1 == y2) grid[y][x].uwal = true;
else grid[y2][x].uwal = true;
else
if (x + 1 == x2) grid[y][x].rwal = true;
else grid[y][x2].rwal = true;
}
// 姹傚悇鐐瑰埌婧愮偣鐨勬渶灝忔鏁幫紙BFS錛?/span>
q.push(make_pair(0, 0));
grid[0][0].scnt = 0;
while (!q.empty())
{
y = q.front().first, x = q.front().second;
if (y < h - 1 && grid[y][x].uwal == false && grid[y + 1][x].scnt == -1)
{
grid[y + 1][x].scnt = grid[y][x].scnt + 1;
q.push(make_pair(y + 1, x));
}
if (0 < y && grid[y - 1][x].uwal == false && grid[y - 1][x].scnt == -1)
{
grid[y - 1][x].scnt = grid[y][x].scnt + 1;
q.push(make_pair(y - 1, x));
}
if (0 < x && grid[y][x - 1].rwal == false && grid[y][x - 1].scnt == -1)
{
grid[y][x - 1].scnt = grid[y][x].scnt + 1;
q.push(make_pair(y, x - 1));
}
if (x < w - 1 && grid[y][x].rwal == false && grid[y][x + 1].scnt == -1)
{
grid[y][x + 1].scnt = grid[y][x].scnt + 1;
q.push(make_pair(y, x + 1));
}
q.pop();
}
// 姹傚悇鐐瑰埌緇堢偣鐨勬渶灝忔鏁幫紙BFS錛?/span>
q.push(make_pair(desy, desx));
grid[desy][desx].dcnt = 0;
while (!q.empty())
{
y = q.front().first, x = q.front().second;
if (y < h - 1 && grid[y][x].uwal == false && grid[y + 1][x].dcnt == -1)
{
grid[y + 1][x].dcnt = grid[y][x].dcnt + 1;
q.push(make_pair(y + 1, x));
}
if (0 < y && grid[y - 1][x].uwal == false && grid[y - 1][x].dcnt == -1)
{
grid[y - 1][x].dcnt = grid[y][x].dcnt + 1;
q.push(make_pair(y - 1, x));
}
if (0 < x && grid[y][x - 1].rwal == false && grid[y][x - 1].dcnt == -1)
{
grid[y][x - 1].dcnt = grid[y][x].dcnt + 1;
q.push(make_pair(y, x - 1));
}
if (x < w - 1 && grid[y][x].rwal == false && grid[y][x + 1].dcnt == -1)
{
grid[y][x + 1].dcnt = grid[y][x].dcnt + 1;
q.push(make_pair(y, x + 1));
}
q.pop();
}
// 鍒ゆ柇璺緞鏄惁鍞竴鏈鐭紝浠ュ強(qiáng)澧欐槸鍚﹀浣?/span>
ok = true;
for (y = 0; y < h && ok; ++y)
for (x = 0; x < w && ok; ++x)
{
if (grid[y][x].scnt == -1 || grid[y][x].dcnt == -1)
ok = false; // 鏄惁鏈夊皝闂尯鍩?/span>
if (y < h - 1 && grid[y][x].uwal
&& grid[y][x].scnt + grid[y + 1][x].dcnt + 1 > steps
&& grid[y][x].dcnt + grid[y + 1][x].scnt + 1 > steps)
ok = false; // 鏄惁涓婂澶氫綑
if (x < w - 1 && grid[y][x].rwal
&& grid[y][x].scnt + grid[y][x + 1].dcnt + 1 > steps
&& grid[y][x].dcnt + grid[y][x + 1].scnt + 1 > steps)
ok = false; // 鏄惁鍙沖澶氫綑
if (!grid[y][x].inpath && grid[y][x].scnt + grid[y][x].dcnt <= steps)
ok = false; // 鏄惁瀛樺湪鏇寸煭璺緞鎴栧彟涓鏈鐭礬寰?/span>
}
if(ok) cout << "CORRECT" << endl;
else cout << "INCORRECT" << endl;
}
return 0;
}