博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
URAL 1016 Cube on the Walk
阅读量:5930 次
发布时间:2019-06-19

本文共 2897 字,大约阅读时间需要 9 分钟。

URAL_1016

    由于立方体位于同一个点时可能有不同的形态,从而有不同的结果,因此我们可以根据立方体的形态将棋盘上一个点拆成若干个点,然后做最短路即可。当然,由于状态比较复杂,可以用哈希表映射出每个点的存储位置。

#include
#include
#define MAXD 1000010#define Q 1000000#define HASH 1000003#define INF 0x3f3f3f3fint dx[] = {-1, 1, 0, 0}, dy[] = {
0, 0, 1, -1};int ch[][6] = {
{
0, 1, 5, 2, 3, 4}, {
0, 1, 3, 4, 5, 2}, {
2, 4, 1, 3, 0, 5}, {
4, 2, 0, 3, 1, 5}};char b[10];int sx, sy, tx, ty, qx[MAXD], qy[MAXD], st[MAXD][6], v[MAXD], where[MAXD];struct Hashmap{ int f[MAXD], head[HASH], next[MAXD], e, state[MAXD][6], x[MAXD], y[MAXD], p[MAXD]; void init() { memset(head, -1, sizeof(head)); e = 1; } int hash(int s) { int i, h, seed = 131; h = qx[s] * seed + qy[s]; for(i = 0; i < 6; i ++) h = h * seed + st[s][i]; return (h & 0x7fffffff) % HASH; } int push(int s, int fa) { int i, h = hash(s); for(i = head[h]; i != -1; i = next[i]) if(x[i] == qx[s] && y[i] == qy[s] && memcmp(st[s], state[i], sizeof(state[i])) == 0) break; if(i == -1) { x[e] = qx[s], y[e] = qy[s], memcpy(state[e], st[s], sizeof(st[s])), f[e] = v[s]; p[e] = fa; next[e] = head[h], head[h] = e; return e ++; } if(v[s] < f[i]) { f[i] = v[s], p[i] = fa; return i; } return 0; }}hm;void print(int cur){ if(hm.p[cur] != -1) print(hm.p[cur]); printf(" %c%c", hm.x[cur] + 'a', hm.y[cur] + '1');}void solve(){ int i, j, k, front, rear, x, y, newx, newy, ans = INF; front = 0, rear = 1; hm.init(); hm.push(0, -1); while(front != rear) { x = qx[front], y = qy[front]; for(i = 0; i < 4; i ++) { newx = x + dx[i], newy = y + dy[i]; if(newx >= 0 && newx < 8 && newy >= 0 && newy < 8) { qx[rear] = newx, qy[rear] = newy; for(j = 0; j < 6; j ++) st[rear][ch[i][j]] = st[front][j]; v[rear] = v[front] + st[rear][4]; if(k = hm.push(rear, where[front])) { where[rear] = k; ++ rear; if(rear > Q) rear = 0; } } } ++ front; if(front > Q) front = 0; } for(i = 1; i < hm.e; i ++) if(hm.x[i] == tx && hm.y[i] == ty && hm.f[i] < ans) ans = hm.f[i], k = i; printf("%d", ans); print(k); printf("\n");}int main(){ int i; while(scanf("%s", b) == 1) { sx = b[0] - 'a', sy = b[1] - '1'; scanf("%s", b); tx = b[0] - 'a', ty = b[1] - '1'; qx[0] = sx, qy[0] = sy; for(i = 0; i < 6; i ++) scanf("%d", &st[0][i]); v[0] = st[0][4], where[0] = 1; solve(); } return 0;}

转载地址:http://bzutx.baihongyu.com/

你可能感兴趣的文章
Java对日期Date类进行加减运算,年份加减,月份加减
查看>>
HTTP协议
查看>>
无法启动调试--未安装 Silverlight Developer 运行时。请安装一个匹配版本。
查看>>
vs code 写C心得
查看>>
Mvc窗口验证功能
查看>>
django使用mysql
查看>>
C# Ftp操作工具类
查看>>
Revit API修改保温层厚度
查看>>
模型评估---交叉验证
查看>>
修改Config文件
查看>>
候捷谈Java反射机制
查看>>
关系代数中的除法运算
查看>>
linux 获取帮助的命令
查看>>
Android程序创意过滤与失败经验谈
查看>>
Python 设置系统默认编码 分类: Python ...
查看>>
11.17个人计划
查看>>
数组的声明和操作
查看>>
Asp.net实现直接在浏览器预览Word、Excel、PDF、Txt文件(附源码)
查看>>
原码、反码、补码
查看>>
列表相关元素及其属性
查看>>