1024

#include<stdio.h>
#include<string.h>
#define __I_MAX_W__ 100
//标识每一个点是否能向上或向右前进
//不得不说一些,墙的信息指两个点不通
int i_w,i_h;
int i_wall_number;
int i_x1,i_x2,i_y1,i_y2;
 
 
 
unsigned char map_wall[__I_MAX_W__][__I_MAX_W__][2];
short int map_walk[__I_MAX_W__][__I_MAX_W__];
short int map_walk2[__I_MAX_W__][__I_MAX_W__];
unsigned char s_path[__I_MAX_W__*__I_MAX_W__+1];
int i_path_len;
typedef struct SNode{
    unsigned char x,y;
}SNode;
SNode s_queue[__I_MAX_W__*__I_MAX_W__];
int i_queue_start;
int i_queue_end;
typedef struct SWall{
    unsigned char x,y,x2,y2;
}SWall;
SWall s_wall_list[__I_MAX_W__*__I_MAX_W__];
int i_wall_list_use;
void fInit()
{
    memset(map_wall,0,__I_MAX_W__*__I_MAX_W__*2);
    memset(map_walk,0,__I_MAX_W__*__I_MAX_W__*sizeof(short int));
    memset(map_walk2,0,__I_MAX_W__*__I_MAX_W__*sizeof(short int));
    i_wall_list_use = 0;
}
int fWalk(unsigned char i_start_x,
          unsigned char i_start_y,
          short int map_walk[][__I_MAX_W__])
{
    i_queue_start = i_queue_end = 0;
//    printf("**************\n");
    s_queue[i_queue_end++] = {i_start_x,i_start_y};
    while(i_queue_start != i_queue_end )
    {
        SNode s_node = s_queue[i_queue_start++];
        short int i_path_len_t = map_walk[s_node.x][s_node.y]>0?map_walk[s_node.x][s_node.y]:-map_walk[s_node.x][s_node.y];
//        if(i_path_len_t == i_path_len+1)
//        {
//            break;
//        }
        //四个方向探测
//        printf("%d %d %d\n",s_node.x,s_node.y,map_walk[s_node.x][s_node.y]);
        unsigned char i_next_x,i_next_y;
 
        for(int i = 0 ;i < 4 ; ++i)
        {
            int i_status = 0;
            switch(i)
            {
            case 0://R
                if(s_node.x+1<i_w&&map_wall[s_node.x][s_node.y][0]==0)
                {
                    i_status = 1;
                    i_next_x = s_node.x+1;
                    i_next_y = s_node.y;
                }
                break;
            case 1://L
                if(s_node.x-1>=0&&map_wall[s_node.x-1][s_node.y][0]==0)
                {
                    i_status = 1;
                    i_next_x = s_node.x-1;
                    i_next_y = s_node.y;
                }
                break;
            case 2://U
                if(s_node.y+1<i_h&&map_wall[s_node.x][s_node.y][1]==0)
                {
                    i_status = 1;
                    i_next_x = s_node.x;
                    i_next_y = s_node.y+1;
                }
                break;
            case 3://D
                if(s_node.y-1>=0&&map_wall[s_node.x][s_node.y-1][1]==0)
                {
                    i_status = 1;
                    i_next_x = s_node.x;
                    i_next_y = s_node.y-1;
                }
                break;
            }
            if(i_status)
            {
                if(map_walk[i_next_x][i_next_y] == 0)
                {
                    s_queue[i_queue_end++] = {i_next_x,i_next_y};
                    map_walk[i_next_x][i_next_y] =i_path_len_t+1;
                }else if(map_walk[i_next_x][i_next_y] < 0)
                {
                    short int i_value = - map_walk[i_next_x][i_next_y];
                    if(i_value > i_path_len_t +1 )
                    {
                        return 0;
                    }else if(i_value == i_path_len_t+1)
                    {
                        if(map_walk[s_node.x][s_node.y]>0)
                        {
                            return 0;
                        }else
                        {
                            s_queue[i_queue_end++] = {i_next_x,i_next_y};
                        }
                    }
                }
            }
        }
    }
//    for(int j = 0 ;j < i_h;++j)
//    {
//        for(int i = 0;i< i_w;++i)
//        {
//            printf("%02d",map_walk[i][j]>0?map_walk[i][j]:-map_walk[i][j]);
//        }
//        printf("\n");
//    }
//    printf("\n");
    return 1;
 
}
int fCheckWalkMust()
{
    for(int i = 0 ;i < i_wall_list_use;++i)
    {
        int i_status = 0;
        short int i_start_len  = map_walk[s_wall_list[i].x][s_wall_list[i].y];
        short int i_end_len =  map_walk2[s_wall_list[i].x2][s_wall_list[i].y2];
        if(i_start_len == 0 || i_end_len == 0)
        {
            return 0;
        }
        if (i_start_len < 0){i_start_len = - i_start_len;}
        if(i_end_len < 0){i_end_len = - i_end_len;}
        if(i_end_len+i_start_len > i_path_len +2
                ||i_start_len==0
                ||i_end_len ==0)
        {
            ++i_status;
        }
        i_start_len  = map_walk2[s_wall_list[i].x][s_wall_list[i].y];
        i_end_len =  map_walk[s_wall_list[i].x2][s_wall_list[i].y2];
 
        if(i_start_len == 0 || i_end_len == 0)
        {
            return 0;
        }
        if (i_start_len < 0){i_start_len = - i_start_len;}
        if(i_end_len < 0){i_end_len = - i_end_len;}
        if(i_end_len+i_start_len > i_path_len +2
                ||i_start_len==0
                ||i_end_len ==0)
        {
            ++i_status;
        }
        if(i_status == 2)
        {
            return 0;
        }
    }
    return 1;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t-->0)
    {
        int i_status = 1;
        scanf("%d %d",&i_w,&i_h);
        scanf("%s\n",s_path);
        scanf("%d",&i_wall_number);
        fInit();
        while(i_wall_number-- >0)
        {
            scanf("%d %d %d %d",&i_x1,&i_y1,&i_x2,&i_y2);
            s_wall_list[i_wall_list_use++] = {i_x1,i_y1,i_x2,i_y2};
            if (i_x1 + 1 == i_x2)
            {
                map_wall[i_x1][i_y1][0]=1;
            }else if(i_y1+1 == i_y2)
            {
                map_wall[i_x1][i_y1][1]=1;
            }else if(i_x1 == i_x2+1)
            {
                map_wall[i_x2][i_y2][0] = 1;
            }else
            {
                map_wall[i_x2][i_y2][1] = 1;
            }
        }
 
        i_path_len = strlen((const char*)s_path);
        int i_x,i_y;
        i_x = i_y = 0;
        int i = 2;
        map_walk2[0][0] = -i_path_len-1;
        map_walk[0][0] = -1;
        for(unsigned char* p_path = s_path;
            *p_path != '\0';
            ++p_path,++i)
        {
            switch(*p_path)
            {
            case 'R':
                if(map_wall[i_x][i_y][0] == 1)
                {
                    i_status = 0;
                }
                ++i_x;
                break;
            case 'L':
                if(map_wall[i_x-1][i_y][0] == 1)
                {
                    i_status = 0;
                }
                --i_x;
                break;
            case 'U':
                if(map_wall[i_x][i_y][1] == 1)
                {
                    i_status = 0;
                }
                ++i_y;
                break;
            case 'D':
                if(map_wall[i_x][i_y-1][1] == 1)
                {
                    i_status = 0;
                }
                --i_y;
                break;
            }
            map_walk[i_x][i_y] = -i;
            map_walk2[i_x][i_y] = - (i_path_len + 2 - i);
        }
        if(i_status == 0
                || fWalk(0,0,map_walk) == 0
                || fWalk(i_x,i_y,map_walk2) == 0
                || fCheckWalkMust() == 0)
        {
            printf("INCORRECT\n");
        }else
        {
            printf("CORRECT\n");
        }
 
    }
    return 0;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值