1024

    xiaoxiao2021-12-03  20

    #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("d",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; }
    转载请注明原文地址: https://ju.6miu.com/read-680214.html

    最新回复(0)