那个经典的立方块游戏应该很多人都玩过,要求把立方块从给定的位置移动到(0,0)所需要步数的最小值。地图无限大,坐标可为负。

算是3322的加强版?3322裸搜即可,加一些判断,直接BFS。

而这道题坐标范围是10^9,显然不能搜索这么大的一个范围。不过考虑,因为地图无限大,没有那些点不能走的限制,所以这个游戏在距离目标点很远时肯定是以最少步数赶到一个比较近的地方执行最优策略。

所以我们只需要提前预处理一下以(0,0)为中心四周一小部分的所有状态的最少步数即可。我预处理的大小是200*200的正方形(貌似50*50就可以?)。
当然要算上负坐标,所以这里的坐标都加上了100,目标点就是(100,100),起始位置是(x+100,y+100)。

然而对于初态是U(直立)的情况,可以直接按照最快的方式赶到预处理好的范围内(最后使它仍为直立状态)。而其他两种情况就不同了,需要把它们先变成直立的情况,再以最快的方式赶到预处理的范围内。

然而以H(横着)为例,把它变成直立有10种不同方案,对应10个直立的位置。如图,蓝色为初态,橘红色是10种不同的直立方案。稍加思考就能明白这10种会对应不一样的结果,而且只有这10种,没有第11种。

V(竖着)时同理。

#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>
using namespace std;int d[3][205][205];
bool vis[3][205][205];
char beg[2];struct ZT {int t, x, y;};
queue <ZT> q;// 0 : U ;  1 : H ; 2 : V
// 0 Up 1 Down 2 Left 3 Rightint C1[3][4] = {{ 2,2,1,1}, { 1,1,0,0}, { 0,0,2,2}};
int C2[3][4] = {{-2,1,0,0}, {-1,1,0,0}, {-1,2,0,0}};
int C3[3][4] = {{0,0,-2,1}, {0,0,-1,2}, {0,0,-1,1}};bool InMap(int x, int y){return x <= 200 && x > 0 && y <= 200 && y > 0;
}int skip(int &x, int &y)
{int res = 0;if(x > 200){int k = x - 200;k = k / 3 + 2;res += k * 2; x -= k * 3;}if(y > 200){int k = y - 200;k = k / 3 + 2;res += k * 2; y -= k * 3;}return res;
}int calc(int x, int y)
{int res = 0;if(!InMap(x, y)) res = skip(x, y); res += d[0][x][y];return res;
}int main()
{ZT t, nx;t.t = 0, t.x = t.y = 100;vis[0][100][100] = 1;q.push(t); while(!q.empty()){t = q.front(); q.pop();for(int i = 0; i < 4; i++){nx.t = C1[t.t][i];nx.x = C2[t.t][i] + t.x;nx.y = C3[t.t][i] + t.y;if(InMap(nx.x, nx.y) && !vis[nx.t][nx.x][nx.y]){q.push(nx); vis[nx.t][nx.x][nx.y] = 1;d[nx.t][nx.x][nx.y] = d[t.t][t.x][t.y] + 1;}}}while(~scanf("%s", beg)){int ans, x, y;scanf("%d %d", &x, &y);x += 100; y += 100;if(beg[0] == 'U') ans = calc(x, y);if(beg[0] == 'H'){ans = calc(x-2, y-1) + 3;for(int i = -1; i <= 2; i++)ans = min(ans, calc(x+i, y-1) + abs(i) + 1);for(int i = -2; i <= 2; i++)ans = min(ans, calc(x+i, y+2) + abs(i) + 1);}if(beg[0] == 'V'){ans = calc(x-1, y-2) + 3;for(int i = -1; i <= 2; i++)ans = min(ans, calc(x-1, y+i) + abs(i) + 1);for(int i = -2; i <= 2; i++)ans = min(ans, calc(x+2, y+i) + abs(i) + 1);}printf("%d\n", ans);}   return 0;
} 

POJ 3323 搜索相关推荐

  1. 整理:poj 基本搜索

    参考:http://exp-blog.com/ https://blog.csdn.net/consciousman/article/details/54613292 POJ2488 – A Knig ...

  2. poj 1948(搜索+剪枝)

    解题思路:这道题看到数据量,想到应该搜索+剪枝应该可以过..可是别人的A了,我的却超时了... 我用了一个mark[a][b],表示前两条边长度分别为a和b时,是否已经处理过,如果是的话就直接跳出.. ...

  3. poj 1699 搜索(AGCT组成最短串,题目有BUG)

    题意:给定若干个DNA(由AGCT组成)串,求一个能够包含所有给定串的长串的最小长度.比如包含如下五个串:'TCGG', 'GCAG', 'CCGC', 'GATC' 和 'ATCG的结果是CCGCA ...

  4. poj 1935(搜索+回溯)

     解题思路: 先我们考虑从源点出发到所有自己想要经过的点然后在回到源点sum,显然每条边都必须经过源点(这个我们可以一次dfs求出),但题目的意思是可以不用回到源点,那么我们可以再求源点到所有要经 ...

  5. poj 2078(搜索+剪枝)

     解题思路:可以一行一行地递归求解,要是不符合条件就回溯,注意最后一行不能够移动它,因为可能会与之前重叠.. #include<iostream> #include<cstdio ...

  6. POJ 2248 搜索

    剪枝: 1.从后向前枚举 2.迭代加深 然后就0msAC了 //By SiriusRen #include <cstdio> using namespace std; int n,T,s[ ...

  7. poj 3323 Matrix Power Series (矩阵乘法 非递归形式)

    为了搞自动机+矩阵的题目,特来学习矩阵快速幂..........非递归形式的求Sum(A+A^2+...+A^k)不是很懂,继续弄懂................不过代码简洁明了很多,亮神很给力 # ...

  8. POJ 3279 搜索

    给出最高15*15的0 1矩阵,每次可以翻转一个点,其相邻的4个点都被翻转,问最少翻转几次可以全部变为0 题中要求的字典序根本不用考虑... 枚举第一行的翻转所有翻转情况然后逐行向下更新即可,因为第一 ...

  9. php 根据权重随机数,PHP根据概率产生随机数

    假设 有四个选项:a 占 10%,b占20% ,C占30% , d 占 40% ,原理就是现获取随机数,然后找区间. 当然了,选项的数量可以任意.目前默认是 总和是 100% .如果需要别的数,修改  ...

最新文章

  1. Struts2中的拦截器与过滤器学习
  2. python使用字典实现switch_python之 利用字典与函数实现switch case功能
  3. Codeforces Round #632 (Div. 2)巧用小技巧
  4. keepalived高可用集群学习以及实验总结
  5. PHP 会话 线程 进程,php进程后台调用(多线程/进程)
  6. 一点php博客,PHP一点认识
  7. 小米回应“海量备货致亏损”;美团饿了么“偷听”?苹果发布新 iPad | 极客头条...
  8. 802.11 monitor模式
  9. Ubuntu chmod 命令
  10. Search Insert Position - LeetCode
  11. Docker常见命令
  12. Spring的DI(Ioc) - 利用构造器注入
  13. 单片机c语言入门自学,单片机C语言入门教程
  14. nmake下一些错误的解决办法
  15. 大米云主机nodejs服务部署
  16. 从美国人工智能年会看2017世界人工智能最新研究成果
  17. python利用pil 制作透明图片水印
  18. JS+html--实现图片轮播
  19. ceph rbd mysql_ceph rbd操作
  20. virtual memory exhausted: Cannot allocate memory 解决办法 命令分配交换空间

热门文章

  1. swoole + 浏览器webSocket 实现的聊天室
  2. 短视频开发的基石:短视频源码
  3. 2020大学计算机学科评估,【第四轮学科评估】学科评估2020完整(三篇汇总)word版(26页)-原创力文档...
  4. makefile示例
  5. 通俗易懂 理解散度和旋度
  6. 送给前线码农的话 - 大牛们的经典语录
  7. 校花干得土得掉渣的事
  8. 【Ai工具合集,一定有你需要的!】
  9. 数学1——概率与数学期望
  10. 基于android的智能秤App,基于Android的智能运动健康秤产品App的设计与实现