HDU 3912 Turn Right 题解
来源:互联网 发布:ubuntu 64位 飞秋下载 编辑:程序博客网 时间:2024/06/15 01:58
题意
给定一个迷宫,包括出入口所在列(行、列为0到R-1,0到C-1,入口所在行是第0行以上,出口所在行是第R-1行以下)、两个格子之间是否有墙,按照能右转就右转,不然再能直走就直走,不然再能左转就左转,不然就后退转身的操作走迷宫,从入口走到出口一次,从出口走到入口一次,问是否走了所有格子至少一遍
思路
记忆化搜索模拟,三个参数当前行,当前列,当前方向,按照题意走
代码
#include <cstdio>int right[501][501],down[501][501];bool vis[501][501];bool st[501][501][4];int dir[4][2]={-1,0,0,1,1,0,0,-1};int T,R,C,Ent_Column,Exit_Column;int tx,ty,f;void dfs(int x,int y,int d){ if(st[x][y][d]) return; st[x][y][d]=true; vis[x][y]=true; if(x==tx&&y==ty&&d==f) return; else if(x+dir[(d+1)%4][0]>=0&&x+dir[(d+1)%4][0]<R&&y+dir[(d+1)%4][1]>=0&&y+dir[(d+1)%4][1]<C&&((d==0&&!right[x][y])||(d==1&&!down[x][y])||(d==2&&!right[x][y-1])||(d==3&&!down[x-1][y]))) dfs(x+dir[(d+1)%4][0],y+dir[(d+1)%4][1],(d+1)%4); else if(x+dir[d][0]>=0&&x+dir[d][0]<R&&y+dir[d][1]>=0&&y+dir[d][1]<C&&((d==0&&!down[x-1][y])||(d==1&&!right[x][y])||(d==2&&!down[x][y])||(d==3&&!right[x][y-1]))) dfs(x+dir[d][0],y+dir[d][1],d); else if(x+dir[(d+3)%4][0]>=0&&x+dir[(d+3)%4][0]<R&&y+dir[(d+3)%4][1]>=0&&y+dir[(d+3)%4][1]<C&&((d==0&&!right[x][y-1])||(d==1&&!down[x-1][y])||(d==2&&!right[x][y])||(d==3&&!down[x][y]))) dfs(x+dir[(d+3)%4][0],y+dir[(d+3)%4][1],(d+3)%4); else dfs(x+dir[(d+2)%4][0],y+dir[(d+2)%4][1],(d+2)%4); return;}int main(){ scanf("%d",&T); while(T--) { bool ans; scanf("%d%d%d%d",&R,&C,&Ent_Column,&Exit_Column); for(int i=0;i<2*R-1;i++) if(i%2==0) for(int j=0;j<C-1;j++) scanf("%d",&right[i/2][j]); else for(int j=0;j<C;j++) scanf("%d",&down[i/2][j]); tx=R-1; ty=Exit_Column; f=1; dfs(0,Ent_Column,2); tx=0; ty=Ent_Column; f=3; dfs(R-1,Exit_Column,0); ans=true; for(int i=0;i<R&&ans;i++) for(int j=0;j<C&&ans;j++) if(!vis[i][j]) ans=false; if(ans) printf("YES\n"); else printf("NO\n"); for(int i=0;i<R;i++) for(int j=0;j<C;j++) vis[i][j]=false; for(int i=0;i<R;i++) for(int j=0;j<C;j++) for(int k=0;k<4;k++) st[i][j][k]=false; } return 0;}
阅读全文
0 0
- HDU 3912 Turn Right 题解
- HDU 3912 Turn Right
- HDU 3912 Turn Right(模拟)
- HDU-3912 Turn Right 简单搜索
- ACM篇:HDU 3912 -- Turn Right
- HDU 3912 Turn Right + HDU 1254 推箱子 + HDU 1983 Kaitou Kid - The Phantom Thief (2)
- HDU 3912 Turn Ringht
- hdu3912 Turn Right
- Right turn bunoj
- SCU4445-Right turn
- 英语练习105 Turn right
- SCU-4445 Right turn(模拟)
- HDU Turn the corner
- HDU 5771 Turn Game
- Turn the corner HDU
- BNUoj 50401 Right turn 转向问题
- Timus 1787. Turn for MEGA 题解
- HDU 2438 Turn the corner
- SSH端口更改后的rsync替代scp实现断点续传
- netty 服务端
- js event对象(逐步更新)
- MFC 宏常识
- 使用Sqoop将HDFS/Hive/HBase与MySQL/Oracle中的数据相互导入、导出
- HDU 3912 Turn Right 题解
- JavaScript的new image()
- CSS 优质文章
- 【编辑工具】Notepad++安装插件的方式(32位、64位)
- 一个软件工程师必须是一个好的雕刻师
- response 设置响应头的常用几种方法
- linux echo -e 处理特殊字符
- HowTomcatWorks学习笔记--一个简单的Web容器
- 关于ObjectInputStream和ObjectOutputStream的顺序问题