题目大意:

有TTT组数据,
每组给出3个数n,h,o" role="presentation" style="position: relative;">n,h,on,h,on,h,o
求在分形图中第nnn级情况下,编号为h" role="presentation" style="position: relative;">hhh和ooo的两个点之间的距离∗10" role="presentation" style="position: relative;">∗10∗10*10为多少。
如图:

分形图随等级增加而增大即每增加一级:
1.右下角,右上角复制一遍
2.顺时针旋转909090度,放到左上角
3.逆时针旋转909090度,放到左下角
4.各部分首尾相连

编号是从左上角那个点开始计111,沿着道路依次计数。

n&lt;16" role="presentation" style="position: relative;">n<16n<16 n
h,o<231h,o<231h, o

分析:

分治,
每次拆成找当前的需要的点xx<script type="math/tex" id="MathJax-Element-24">x</script>在左上,右上,左下,右上哪个部分然后递归过去,
慢慢拆开然后在过程中计算坐标的位置即可。
不过细节略多。

代码:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define N 40using namespace std;typedef long long ll;ll num[N];void dfs(ll n, ll cnt, ll &x, ll &y)
{if (n == 1) {if (cnt == 1) x = 1, y = 1;if (cnt == 2) x = 1, y = 2;if (cnt == 3) x = 2, y = 2;if (cnt == 4) x = 2, y = 1;return;}ll tot = num[n] * num[n] / 4;if (cnt <= tot){dfs(n - 1, cnt, y, x);return;}if (cnt <= 2*tot) {dfs(n - 1, cnt - tot, x, y);y += num[n] >> 1;return;}if (cnt <= 3*tot) {dfs(n - 1, cnt - 2*tot, x, y);x += num[n]>>1;y += num[n]>>1;return;}dfs(n - 1, cnt - 3*tot, y, x);x = num[n] - x + 1;y = (num[n]>>1) - y + 1;
}int main()
{num[0] = 1; for (int i = 1; i <= 31; i++) num[i] = num[i-1]<<1;int T, n;ll A, B;scanf("%d", &T);while (T--){scanf("%d %lld %lld", &n, &A, &B);ll x1, x2, y1, y2;dfs(n, A, x1, y1);dfs(n, B, x2, y2);ll ans = sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2)) * 10 + 0.5;printf("%lld\n", ans);}return 0;

Poj P3889 Fractal Streets___规律+dfs+分治相关推荐

  1. POJ 3889 Fractal Streets(逼近模拟)

    $ POJ~3889~Fractal~Streets $(模拟) $ solution: $ 这是一道淳朴的模拟题,最近发现这种题目总是可以用逼近法,就再来练练手吧. 首先对于每个编号我们可以用逼近法 ...

  2. POJ - 2083 Fractal(dfs,递归画图)

    题目链接:点击查看 题目大意:给出一个n,要求递归画图 题目分析:重点就是设计递归啦,也没什么好说的,因为题目保证了n小于等于7,然后矩阵的大小为3^(n-1)*3^(n-1)所以矩阵最大不超过729 ...

  3. #分治#poj 3889 Fractal Streets

    题目 问两个村庄之间的直线距离*10 分析 可以用分治的方法求出两个点的坐标,求出答案. 代码 #include <cstdio> #include <cmath> using ...

  4. #分治#poj 2083 Fractal

    题目 若B(1)=′X′B(1)='X'B(1)=′X′ B(n)(n>1)=B(n)(n>1)=B(n)(n>1)= B(n−1)(3n−1个空格)B(n−1)B(n-1)(3^{ ...

  5. POJ 3087 Shuffle'm Up DFS

    link:http://poj.org/problem?id=3087 题意:给你两串字串(必定偶数长),按照扑克牌那样的洗法(每次从S2堆底中拿第一张,再从S1堆底拿一张放在上面),洗好后的一堆可以 ...

  6. Philosopher’s Walk ICPC 2017 Daejeon F dfs 分治

    问题 F: Philosopher's Walk 时间限制: 1 Sec  内存限制: 128 MB 提交: 70  解决: 33 [提交] [状态] [讨论版] [命题人:admin] 题目描述 I ...

  7. poj 1321 棋盘问题(dfs)

    题目:http://poj.org/problem?id=1321 没什么难度,比较水... View Code 1 #include <iostream> 2 #include<c ...

  8. POJ 2676/2918 数独(dfs)

    思路:记录每行每列每一个宫已经出现的数字就可以.数据比較弱 另外POJ 3074 3076 必须用剪枝策略.但实现较麻烦,还是以后学了DLX再来做吧 //Accepted 160K 0MS #incl ...

  9. 【POJ - 1741】Tree(树分治,容斥,点分治,模板题)

    题干: Give a tree with n vertices,each edge has a length(positive integer less than 1001). Define dist ...

最新文章

  1. c++11 function
  2. SAP EWM - 物料主数据 - EWM系统包装视图属性
  3. [置顶] 谈谈找工作过程中的那些环节、注意点和经验
  4. 轻量级3d模型查看器_耐能取得两项软件著作权,自研轻量级3D人脸识别算法领先业界...
  5. python中的列表生成式
  6. 常见的天气现象有哪些
  7. 《论语》读后颜渊第十二主要大意
  8. java中事件的概念,事件中心上IoTHub数据的概念
  9. idea 设置jdk_IDEA开发小技巧~jdk问题
  10. Linux学习总结(50)——grep查看打印匹配的下几行或前后几行使用总结
  11. django xadmin 默认密码_Django的认证系统
  12. mysql udf禁用_如何禁用 mysql 的 udf 功能
  13. RPG 学习 一 基本
  14. 三维点云学习(4)5-ransac
  15. Delphi自动清除临时文件及备份文件的批处理
  16. 【游戏】基于matlab中国象棋【含Matlab源码 489期】
  17. 【AI】行为树(Behaviour Tree)
  18. 3D图形学基础 基本概念
  19. 想学Python爬虫么?很简单的鸭~第二课
  20. WebRTC和APP互通连麦直播

热门文章

  1. 禁用计算机硬盘,禁止电脑每次开机都要自动扫描磁盘的多种方法
  2. 使用计算属性实现购物车功能效果(商品数量增减、单选多选计算金额和总价,)
  3. C++习题 倒置排序 OpenJudge
  4. csv文件转换为excel文件
  5. 学习-格鲁夫给经理人的第一课
  6. 电脑录音,台式电脑如何录音_怎么电脑录音-win7之家
  7. 手持PDA和手机有什么区别?
  8. WM_PIANT消息与窗口重画
  9. 计算机麦克风,简易计算机麦克风的制作
  10. 在k8s上部署cerebro访问集群外部署的es