转载请说明出处:http://blog.csdn.net/ben_xsy/article/details/79288058#%E4%BB%A3%E7%A0%81

目录

  • 题目描述
  • 解题思路
  • 代码

题目描述

题目链接:传送门
给你一个原始的分形图,t组数据,对于每组数据,输入3个数n,h,o
(n为在第n级,h,o为两个房子的编号)
求在第n级情况下,编号为h和o的两个点之间的距离*10为多少
其中,第n级分形图形成规则如下:

  1. 首先先在右下角和右上角复制一遍n-1情况下的分形图
  2. 然后将n-1情况下的分形图逆时针旋转90度,放到左上角
  3. 最后将n-1情况下的分形图顺时针旋转90度,放到左下角
  4. 按照上述规则形成n级分形图

编号是从左上角那个点开始计1,沿着道路计数

解题思路

把第n级分形图看成是一个二维坐标,我们需要求出两个点的坐标,然后,根据两点间的距离公式求结果

首先这是一个分形图肯定需要用到递归思想
我们分别比较第n-1级分形图在第n级分形图中的位置来进行计算第n级分形图的情况(n是级数,s是需要求的编号)

递归边界:

当n等于1时(即是最初的那个第1级分形图)1.当s等于1,x=1,y=12.当s等于2,x=1,y=23.当s等于3,x=2,y=24.当s等于4,x=2,y=1

递归式:

1.当前编号小于上一级编号总数时该情况说明当前编号是在n级分形图的左上角,但是左上角分形图是n-1级分形图逆时针旋转90度得到的顾我们带入递归式时,需要将x和y,倒一下不明白的同学可以这样看:第1级道路:(1,1)->(1,2)->(2,2)->(2,1)第2级道路左上角:(1,1)->(2,1)->(2,2)->(1,2)两种情况的x和y情况互换了递归式: rec(n-1,s,y,x);2.当编号小于2倍的n-1数目时,说明当前编号s在分形图的右上角由于右边的分形图没有经过旋转所以我们直接带入递归式,需要注意的是我们的编号要减去上一级的编号,因为我们始终是根据上一级来推出下一级递归式:rec(n-1,s-p[n-1],x,y);递归出来之后,我们的x需要加上上一级的边的大小这从分形图中很容易看出即x=x+(1<<n-1);
3.当编号小于3倍的n-1数目时,跟第2种情况类似,只是递归出来之后,x和y都需要加上上一级的边的大小即rec(n-1,s-2*p[n-1],x,y);//注意编号必须要小于上一级的大小// 因为我们是放在上一级的情况下考虑的x+=(1<<n-1);y+=(1<<n-1);
4.最后一种情况,s在第n级分形图的左下角这种情况跟第2种情况差不多,我们先按照逆时针的情况来解决,这就跟第2种情况一样了然后比较坐标x和y的关系,容易看出,顺时针相比于逆时针x映射为(1<<n)+1-xy映射为(1<<(n-1))+1-y可以观察分形图,这个地方有点难理解可以比较坐标来理解

最后,两个点分别调用递归式,就可以计算出距离了

提交的时候选择G++,poj的c++不知道为什么会编译错误

代码

#pragma comment(linker,"/STACK:102400000,102400000")
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <string>
#include <list>
#include <math.h>
#include <vector>
#include <algorithm>
#include <time.h>
#include <map>
#include <set>
#include <stack>
#include <stdlib.h>
#include <ctype.h>
#include <queue>
#include <bitset>
using namespace std;
#define ll long long
#define ull unsigned long long
#define PI acos(-1.0)
#define E 2.7182818284590452353602874713527
#define si(x) scanf("%d",&x)
#define sl(x) scanf("%lld",&x)
#define pi(x) printf("%d\n",x)
#define pl(x) printf("%lld\n",x)
#define bg(x) cout<<x<<"@@@"<<endl
#define lowbit(x) ((x)&(-(x)))
#define inf 0x3f3f3f3f
#define pii pair<int,int>ll p[40];    //一直算到4的32次方,代表第n级分形图编号总数目
void rec(ll n,ll s,ll &x,ll &y) //n为第n级,编号是s,横坐标x,纵坐标y,注意x和y要引用
{if(n==1)    //递归边界{if(s==1)x=1,y=1;else if(s==2)x=1,y=2;else if(s==4)x=2,y=1;else x=2,y=2;return;}if(s<=p[n-1])   //分类讨论四种情况{rec(n-1,s,y,x);}else if(s<=2*p[n-1]){rec(n-1,s-p[n-1],x,y);y+=(1<<n-1);}else if(s<=3*p[n-1]){rec(n-1,s-2*p[n-1],x,y);x+=(1<<n-1);y+=(1<<n-1);}else{rec(n-1,s-3*p[n-1],y,x);x=(1<<n)+1-x;y=(1<<n-1)+1-y;}
}
int main()
{p[1]=4;for(int i=2;i<=33;i++)p[i]=4*p[i-1]; //初始化int t;si(t);while(t--){ll s,e,n,sx,sy,ex,ey;scanf("%lld%lld%lld",&n,&s,&e);rec(n,s,sx,sy); //分别求出s和e的坐标rec(n,e,ex,ey);printf("%.0f\n",sqrt((sx-ex)*(sx-ex)+(sy-ey)*(sy-ey))*10);}}

[poj3889]Fractal Streets相关推荐

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

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

  2. Fractal Streets(经典分形递归+坐标旋转)

    原题链接:Fractal Streets 题面: 思路: 本题关键要解决:求编号为MMM的房屋在NNN级城市中的位置.把该问题记为 calc(N,M)calc(N, M)calc(N,M) ,本题就是 ...

  3. 【POJ3889】Fractal Streets(分形图)

    problem 给你一个原始的分形图 t组数据,对于每组数据,输入3个数n,h,o (n为在第n级,h,o为两个房子的编号) 求在第n级情况下,编号为h和o的两个点之间的距离*10为多少 其中,第n级 ...

  4. Fractal Streets (POJ3889)(分形图、递归)

    题目传送门:http://poj.org/problem?id=3889 感谢大雪菜大神bilibili上的讲解和李煜东大神书本的引导. 题面大概意思是: 给你一个原始的分形图,t组数据,对于每组数据 ...

  5. Fractal Streets

    FractalStreetsFractal StreetsFractal Streets 题目链接:POJ 3889 题目大意 给你一个原始的分形图,ttt组数据,对于每组数据,输入333个数nnn, ...

  6. Fractal Streets||分形之城

    这道题-蛮难的- 今天看到一句话,特别适合做这道题 文章目录 问题描述 思考 AC代码: 问题描述 城市的规划在城市建设中是个大问题. 不幸的是,很多城市在开始建设的时候并没有很好的规划,城市规模扩大 ...

  7. Fractal Streets 递归+坐标转换

    n阶分形图是由前面的(n-1)阶分形图所构成: 左上角是沿Y轴右旋转90度再沿X轴选择180度: 右上角不变: 左下角是沿Y轴左旋转90度再沿X轴选择180度: 右下角不变. 再找到对应的坐标变换: ...

  8. #分治#poj 3889 Fractal Streets

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

  9. 0x02.基本算法 — 递推与递归

    目录 一.递推与递归 二.分治 三.模拟计算机实现递归 四.相应习题: 0.AcWing 92. 递归实现指数型枚举(递归/循环+位运算) 1.AcWing 93. 递归实现组合型枚举 2.AcWin ...

最新文章

  1. 《Linux内核设计与实现》读书笔记(8)--- 内核同步方法(2)
  2. 微软 word转换pdf_如何将行转换为Microsoft Word表中的列
  3. python open写入_Python3 open() 函数详解 读取文件写入文件追加文件二进制文件
  4. jboss7(01)服务器开启和关闭命令
  5. 【bzoj3119】Book
  6. 机器学习笔记2 – sklearn之iris数据集
  7. CMake中include指令介绍
  8. C程序设计--排序(冒泡、选择、插入)--选择
  9. 利用BP神经网络 设计一个三层神经网络解决手写数字的识别问题
  10. 传统BIOS下的USB启动设置
  11. 迅雷 linux 命令行 版本号,在Linux系统下使用wine运行迅雷5的方法
  12. UG NX 12 基准轴
  13. 玩客云手动设置IP地址
  14. android应用开发-从设计到实现 4-8 天气预报的布局
  15. flash传值php乱码,Flash中出现中文乱码的解决办法,网页模板帮助中心
  16. 解决调用组件,组件内容不加载的问题
  17. Python绘制指数加权平均线
  18. 绿之韵传销是空穴来风,一心一意为健康事业奋斗
  19. C#图形教程画笔画刷等
  20. 获取HDC的几种方法

热门文章

  1. 如何使用 LK 字幕脚本工具
  2. Android11 DHCP初识
  3. 通用产品 云OA SaaS三管齐下
  4. Anaconda点开一直处于loading application状态
  5. Linux 文件rwx权限问题 chmod 777 XXX 任何人拥有最高权限
  6. 苹果手机滑动光标怎么设置_iPhone手机三种方便又准确的移动光标方式
  7. Robocup3D第一次笔记
  8. 项目管理之如何进行项目干系人管理
  9. 摄影测量期末复习cumt
  10. 今天遇到一个报错信息