poj 3083 Children of the Candy Corn
2016-05-28 16:55
489 查看
我要吃糖!!!(^o^)/~
题目大意:
多case,给出cas张地图,’#’代表墙,’.’代表坦坦大道,也就是说你要是不想死的话就好好走’.’吧! >o<
要求输出3个数字,第一个—优先向左靠墙走,第二个—优先向右靠墙走,第三个—最短路
分析:
STMD算法!!!
第三个答案很好说,大家都会,那么优先向左/右走呢???
以优先向左为例吧♪(^∇^*)
我们只要找出方向优先级就好啦
左上右下,按照这个顺序走找到答案即可
(**记得要保存你当前的方向)
代码如下:
by >o< neighthorn
题目大意:
多case,给出cas张地图,’#’代表墙,’.’代表坦坦大道,也就是说你要是不想死的话就好好走’.’吧! >o<
要求输出3个数字,第一个—优先向左靠墙走,第二个—优先向右靠墙走,第三个—最短路
分析:
STMD算法!!!
第三个答案很好说,大家都会,那么优先向左/右走呢???
以优先向左为例吧♪(^∇^*)
我们只要找出方向优先级就好啦
左上右下,按照这个顺序走找到答案即可
(**记得要保存你当前的方向)
代码如下:
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> using namespace std; const int maxn=40+5; int cas,row,columns,maxdep,flag; int start[2+1],pri[4][2+1],end[2+1]; char str[maxn],chess[maxn][maxn]; bool left(int dep,int x,int y,int dire){ for(int i=0;i<=3;i++){ int xx=x+pri[(i+dire+4)%4][1],yy=y+pri[(i+dire+4)%4][2]; if(xx<1||xx>row||yy<1||yy>columns) continue; if(chess[xx][yy]=='E'){ printf("%d ",dep+1),flag=1; return true; } else if(chess[xx][yy]=='.') if(left(dep+1,xx,yy,(i+dire-1+4)%4)) return true; } return false; } bool right(int dep,int x,int y,int dire){ for(int i=0;i<=3;i++){ int xx=x+pri[(dire+2-i+4)%4][1],yy=y+pri[(dire+2-i+4)%4][2]; if(xx<1||xx>row||yy<1||yy>columns) continue; if(chess[xx][yy]=='E'){ printf("%d ",dep+1),flag=1; return true; } else if(chess[xx][yy]=='.') if(right(dep+1,xx,yy,(dire+2-i-1+4)%4)) return true; } return false; } bool id_dfs(int dep,int x,int y,int dire){ if(dep>maxdep) return false; if(abs(end[1]-x)+abs(end[2]-y)+dep-1>maxdep) return false;//一定要加剪枝,不加会TLE的很惨!!!加了0MS,你自己选吧(~~~~(>_<)~~~~) for(int i=0;i<=3;i++){ int xx=x+pri[(i+dire+4)%4][1],yy=y+pri[(i+dire+4)%4][2]; if(xx<1||xx>row||yy<1||yy>columns) continue; if(chess[xx][yy]=='E') return true; else if(chess[xx][yy]=='.') if(id_dfs(dep+1,xx,yy,(i+dire-1+4)%4)) return true; } return false; } int main(){ scanf("%d",&cas); while(cas--){ scanf("%d%d",&columns,&row); for(int i=1;i<=row;i++){ scanf("%s",str); for(int j=1;j<=columns;j++){ chess[i][j]=str[j-1]; if(chess[i][j]=='S') start[1]=i,start[2]=j; else if(chess[i][j]=='E') end[1]=i,end[2]=j; } } pri[0][1]=0,pri[0][2]=-1,pri[1][1]=-1,pri[1][2]=0,pri[2][1]=0,pri[2][2]=1,pri[3][1]=1,pri[3][2]=0; flag=0,left(1,start[1],start[2],0); flag=0,right(1,start[1],start[2],0); for(int i=1;i;i++){ maxdep=i; if(id_dfs(1,start[1],start[2],0)){ printf("%d\n",maxdep+1); break; } } } return 0; }
by >o< neighthorn
相关文章推荐
- 约数详细分析
- java List 排序 Collections.sort()
- java.lang.ClassNotFoundException: javax.persistence.EntityListeners
- 计算机关机操作工具实现
- Android中的图片加载
- 网络流二十四题之十四 —— 孤岛营救问题(RESCUE)
- nyoj 709 第六届河南省大学生程序设计竞赛A
- 第1章 学会提出问题
- 关于“找不到附属汇编 Microsoft.VC90.CRT,上一个错误是 参照的汇编没有安装在系统上。”的解决
- Feature分支
- 关于“找不到附属汇编 Microsoft.VC90.CRT,上一个错误是 参照的汇编没有安装在系统上。”的解决
- 包含min函数的栈
- 设置一个POJO的某个属性的默认值
- 字符串操作函数
- JAVA三大框架SSH的各自作用
- 对Map按key和value分别排序
- Oracle后台进程详解
- DIR - matlab函数
- 配置elasticsearch 以及ik分词
- 拿到腾讯实习offer的前后小事