HDU 3912 Turn Right

     一道单纯的模拟题,说的是一个人从起点去往终点,然后再由终点回到起点,判断其是否能够走完全部的点。

     在行走的过程中存在规则,在一个位置优先走右,然后是前和左,最后是后。

     注意:不是走到终点边缘的格子就ok了,还要判断方向(卡了我好久T_T)。

#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
bool maps[550][550][4];
bool vis[550][550];
int R,C,en,ex;
int gox[4][4]={{1,0,-1,0},{0,-1,0,1},{-1,0,1,0},{0,1,0,-1}};
int goy[4][4]={{0,1,0,-1},{1,0,-1,0},{0,-1,0,1},{-1,0,1,0}};
int dfs(int x,int y,int endx,int endy,int hx){
  //printf("x=%d y=%d hx=%d\n",x,y,hx);
  //system("pause");
  while (1){
    int hy=1;
    for (int i=0;i<4;i++){
      int x0=x+gox[hx][i];
      int y0=y+goy[hx][i];
      if (x0==endx&&y0==endy) return 0;
      if (!maps[x][y][(hx+i+3)%4]&&x0>=0&&x0<R&&y0>=0&&y0<C){
        vis[x0][y0]=true;
        //printf("%d %d %d %d %d\n",x0,y0,i,(hx+i+3)%4,maps[x][y][(hx+i+3)%4]);
        x=x0;y=y0;hx=(hx+i+3)%4;
        //printf("x=%d y=%d hx=%d\n",x,y,hx);
        //system("pause");
        //dfs(x0,y0,endx,endy,(hx+i+3)%4);
        hy=0;
        break;
     }
   }
   if (hy) break;
  }
  return 0;
}
int main (){
  int T;scanf("%d",&T);
  while (T--){
    memset(vis,0,sizeof(vis));
    scanf("%d%d",&R,&C);
    for (int i=0;i<R;i++)
      for (int j=0;j<C;j++)
        vis[i][j]=maps[i][j][0]=maps[i][j][1]=maps[i][j][2]=maps[i][j][3]=false;
    scanf("%d%d",&en,&ex);
    for (int i=0;i<2*R-1;i++){
      if (i%2==0){
        for (int j=0;j<C-1;j++){
            int a;scanf("%d",&a);
            if (a){
              maps[i/2][j][0]=maps[i/2][j+1][2]=true;
            }
        }
      }
      else {
        for (int j=0;j<C;j++){
          int a;scanf("%d",&a);
          if (a) {
            maps[i/2][j][3]=maps[i/2+1][j][1]=true;
          }
        }
      }
    }
   // for (int i=0;i<4;i++){
   //   printf("%d %d %d %d\n",gox[i][0],gox[i][1],gox[i][2],gox[i][3]);
   // }
   dfs(0,en,R,ex,3);
   dfs(R-1,ex,-1,en,1);
    int ans=1;
    for (int i=0;i<R;i++)
      for (int j=0;j<C;j++)
        if (!vis[i][j]) {ans=0;break;}
    if (ans) printf("YES\n");
    else printf("NO\n");
  }
  return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值