[JZOJ4628] 立方体
2016-07-15 16:21
411 查看
Descripton
Solution
不要把这种题想复杂了。这样的东西往往就是搜索。
设f[x][y][q][u][l]表示在x,y这个点以原来的q作为前面,u是上,l是左的最小步数。
按照这个记忆化搜索,dfs带进这5个参数,四个方向直接转移状态。
P.S.某些人十分机(sha)智(bi)的把转移的各种情况打成了表。
码量最多的有3K~~,据说打了一个多小时。
我这个暴力从开打到搞对不超20分钟~
Code
#include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<algorithm> #include<iostream> #define fo(i,a,b) for(i=a;i<=b;i++) #define fod(i,a,b) for(i=a;i>=b;i--) using namespace std; int a[6],f[8][8][6][6][6],sx,sy,ex,ey,ops[6],ans; bool pd(int x,int y) { return (x<=7&&y<=7&&x>=0&&y>=0); } void dfs(int x,int y,int q,int u,int l,int s) { int i,x1,y1; if (x==ex&&y==ey) { ans=min(ans,s); return; } if (f[x][y][q][u][l]<=s) return; f[x][y][q][u][l]=s; x1=x+1; y1=y; if (pd(x1,y1)) dfs(x1,y1,ops[u],q,l,s+a[ops[q]]); x1=x-1; y1=y; if (pd(x1,y1)) dfs(x1,y1,u,ops[q],l,s+a[q]); x1=x; y1=y+1; if (pd(x1,y1)) dfs(x1,y1,q,l,ops[u],s+a[ops[l]]); x1=x; y1=y-1; if (pd(x1,y1)) dfs(x1,y1,q,ops[l],u,s+a[l]); } int main() { char c1,c2,c3,c4,c0; scanf("%c%c%c%c%c",&c1,&c2,&c0,&c3,&c4); sx=c2-'1'; sy=c1-'a'; ex=c4-'1'; ey=c3-'a'; int i; fo(i,0,5) { ops[i]=(i%2==0)?i+1:i-1;//这里表示每个面的对面是什么 } scanf("%d%d%d%d%d%d",&a[0],&a[1],&a[2],&a[5],&a[3],&a[4]); ans=100000000; memset(f,107,sizeof(f)); dfs(sx,sy,0,2,4,a[3]); cout<<ans; }
相关文章推荐
- 获取单选框中的值
- Java之美[从蛮荒到撬动地球]之设计模式二
- JS 数字,金额 用逗号 隔开(数字格式化)
- 记忆化搜索_POJ1088(滑雪)
- 获取屏幕高度、宽度
- Spring boot bean加载错误排查
- linux内核分析之rbtree的使用
- jquery 循环获取选中checkBox框的值
- July 15th 模拟赛C T1 游泳池 Solution
- (译)WebRTC实战: STUN, TURN, Signaling
- 图片加载失败处理
- Python读取一个目录下所有目录和文件的方法
- 关于Editext弹出键盘的右下角样式简单使用
- 何为Web App,何为Hybird App
- linux下安PHP开发环境
- Angular2 快速入门 之 环境搭建
- Hbase的table存储详解
- 1249 Problem Q
- online ddl 使用、测试及关键函数栈
- spring 框架的xml文件如何读取properties文件数据