poj 1024(不要把Qy写成Qx)


#include
#include
using namespace std;
#define maxn 105
int t,w,h,wall_num;
typedef struct node{
    int x1,y1,x2,y2;
}Wall;
Wall wall[maxn*maxn];
int dst_s[maxn][maxn],dst_e[maxn][maxn]; 
const int dx[] = {1,0,-1,0},dy[] = {0,1,0,-1};
void bfs(int x1,int y1,int dst[][maxn]){
    bool vis_bfs[maxn][maxn],isgo;
    memset(vis_bfs,false,sizeof(vis_bfs));
    int head = 0,tail = 0;
    int Qx[maxn*maxn],Qy[maxn*maxn];
    Qx[tail] = x1;
    Qy[tail] = y1;
    vis_bfs[x1][y1] = true;
    tail++;
    while(head<tail){
        int x = Qx[head];
        int y = Qy[head];
        head++;
        for(int i=0;i<4;i++){
            int px = x+dx[i];
            int py = y+dy[i];
            if(vis_bfs[px][py]||px<0||py<0||px>=w||py>=h)continue;
            isgo = false;
            for(int j=0;j){
                if((px==wall[j].x1&&py==wall[j].y1&&x==wall[j].x2&&y==wall[j].y2)||
                   (px==wall[j].x2&&py==wall[j].y2&&x==wall[j].x1&&y==wall[j].y1)){
                       isgo = true;
                       break;
                }
            }
            if(isgo)continue;
            dst[px][py] = dst[x][y]+1;
            vis_bfs[px][py] = true;
            Qx[tail] = px;
            Qy[tail] = py;
            tail++;
        }
    }
}
int main(){
    scanf("%d",&t);
    char c;
    int endx,endy,path_num,x1,y1,x2,y2;
    bool vis[maxn][maxn];
    while(t--){
        path_num = 0;
        endx = endy = 0;
        scanf("%d%d\n",&w,&h);
        memset(vis,false,sizeof(vis));
        vis[0][0] = true;
        while(c=getchar(),c!='\n'){
            switch(c){
                case 'R':endx++;break;
                case 'L':endx--;break;
                case 'U':endy++;break;
                case 'D':endy--;break; 
            }
            path_num++;
            vis[endx][endy] = true;
        }
        scanf("%d",&wall_num);
        for(int i=0;i){
            scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
            wall[i].x1 = x1;
            wall[i].y1 = y1;
            wall[i].x2 = x2;
            wall[i].y2 = y2;
        }
        memset(dst_s,0,sizeof(dst_s));
        memset(dst_e,0,sizeof(dst_e));
        bfs(0,0,dst_s);
        bfs(endx,endy,dst_e);
//        for(int j=h-1;j>-1;j--){
//            for(int i=0;i//                printf("%3d",dst_e[i][j]);
//            }
//            cout<//        }
//        cout<
        bool fail = false;
        for(int i=0;i){
            for(int j=0;j){
                if(!vis[i][j]&&dst_s[i][j]+dst_e[i][j]==path_num){
                    printf("INCORRECT\n");
                    fail = true;
                    break;
                }
            }
            if(fail)break;
        }
        if(fail)continue;
        fail = false;
        for(int i=0;i){
            x1 = wall[i].x1;
            y1 = wall[i].y1;
            x2 = wall[i].x2;
            y2 = wall[i].y2;
            if((dst_s[x1][y1]+dst_e[x2][y2]>path_num&&
                dst_s[x2][y2]+dst_e[x1][y1]>path_num)||
               (dst_s[x1][y1]==0&&dst_e[x1][y1]==0)||
               (dst_s[x2][y2]==0&&dst_e[x2][y2]==0)){
                fail = true;
                break;
            }
        }
        if(fail){
            printf("INCORRECT\n");
            continue;
        }
        printf("CORRECT\n");
    }
    return 0;
}