题目描述

小明有一个爱好,他喜欢在一个无限大的平面上散步,并且他散步的路径是有规律的。每次他会从(1,1)点出发,经过2n x
2n个点,最后在(2n,1)处停下。 他第1、2、3天的散步路径如下图所示。

当n>1时,他第n天的散步路径可以通过如下方法构造:
1 将第n-1阶的路径顺时针旋转90度,之后放在左下角;
2 将第n-1阶的路径放在左上角;
3 将图形沿着中轴线对称构造右半部份;
4 用3条单位线段把四部分连接起来。
现在,小明想要知道,他在第n天走过的某个格子是他 当天走过的第几个格子

输入数据

一行三个整数n,x,y(1<=n<=14,1<=x,y<=2n) 。

输出数据

一行一个整数k,表示坐标为(x,y)的格子是他第n天走过的第k个格子。

样例输入

1 1 2

样例输出

2

解题思路

  • 首先明确,天数n也就是每一轮拓扑的迭代次数。每一次迭代参考的最基本模型就是第一天的路径。
  • 我们整个路径的拓扑是分四模块来考虑的,左下-左上-右上-右下
  • 确定当前是在哪一模块
  • 确定哪一模块后,确定当前位置是在当前模块中的第几步
  • 再加上之前走的“模块”的总步数。(若模块是被走慢的,那么很容易想到,走满一个模块的步数是该模块的单位面积
  • 左下:“路径顺时针旋转90度”,即将坐标系顺时针旋转了90度,则就可以理解为横纵坐标的对换。如下图:(这个可能有点抽象,不理解的自己代数值试一下就懂了)。
  • 左上就简单了,单纯的是坐标向上平移。
  • 右上同左上,只是单纯的平移。
  • 右下,要明白坐标系的变换,如下图:

    所以,x1=mid- y0 +1 ; y1 = 2n- x0 +1。(mid:中轴线;2n:整个路径拓扑的右边界)
    (ps: 这里可以根据同一个点映射到坐标轴的距离不变,这个角度进行考虑)

代码

#include <iostream>
#include <cmath>
using namespace std;int fun(int n, int x, int y) //给定n天数(迭代次数) 和 位置信息(x,y)
{int ans = 0; //记录答案if (n == 1)  //第一天--基础  直接按照位置给出返回值{if (x == 1 && y == 1)return 1;else if (x == 1 && y == 2)return 2;else if (x == 2 && y == 2)return 3;else if (x == 2 && y == 1)return 4;}else{int mid = pow(2, n - 1);    // 中轴线位置:整个长度(2^n) 再除以2if (x <= mid && y <= mid)   //确定在哪一个模块ans = fun(n - 1, y, x); //左下else if (x <= mid && y > mid)ans = fun(n - 1, x, y) + mid * mid; //左上 (相对步数+之前模块的步数)(当你走到左上时,左下已走满)else if (x > mid && y > mid)ans = fun(n - 1, x, y) + 2 * mid * mid; //右上 (相对步数+之前模块的步数)  (当你走到右上时,左下和左上已走满)else if (x > mid && y <= mid)ans = fun(n - 1, mid - y + 1, pow(2, n) - x + 1) + 3 * mid * mid; //右下 (相对步数+之前模块的步数)  (当你走到右下时,左下、左上、右上 三个模块 已走满)}return ans;
}int main()
{int n, x, y;cin >> n >> x >> y;int re = fun(n, x, y);cout << re;system("pause");return 0;
}

写在最后:若文章存在问题,还请各位大佬批评指正,共同进步。

分治算法实践5-小明的散步路径 C++相关推荐

  1. 第八周拓展实践1小明借书

    问题及代码: /*Copyright(c)2016,烟台大学计算机学院 all rights reserved. 作者:曹欣宇 完成日期:2016年10月22日 版本号:v1.0题目描述小明要把5本书 ...

  2. C语言实践项目-小明最多能买多少支玫瑰?(初学者作业)

    任务和代码 /* *Copright (c)2018,csdn学院 *All rights reserveg. *文件名称: *作者名字:汪琪 *完成日期:2018/9/10 * *问题描述:慧过生日 ...

  3. 分治算法实践6-气球游戏 戳气球 C++

    题目描述 刚刚今天去游乐场玩,发现了一个新的游戏项目,游戏是这样的,场上一共有 n 个气球,它们的编号是0到n-1,然后每个气球上还有一个数字,我们使用数组nums来保存这些数字. 现在游戏要求刚刚戳 ...

  4. 信息学奥赛C++语言: 小明的步行

    [题目描述] 小明是一个很会利用时间的学生,他经常晚上吃过饭后一边思考问题一边散步,由于要思考问题,并且思考问题的内容越来越多,所以他在散步时也是越来越慢的,他自己总结出一个规律,他散步时第一步走N厘 ...

  5. 分治算法详解:分而治之

    分治算法核心思想 分治算法用四个字概括就是分而治之. 将原问题划分成多个小规模并且简单的子问题,这些子问题的结构与原问题相似,因此,递归地解决这些子问题,将子问题的解合并就可以得到原问题的解了. 分治 ...

  6. python递归算法 电影院票价问题_算法课堂实验报告(二)——python递归和分治(第k小的数,大数乘法问题)...

    python实现递归和分治 一.开发环境 开发工具:jupyter notebook 并使用vscode,cmd命令行工具协助编程测试算法,并使用codeblocks辅助编写C++程序 编程语言:py ...

  7. 分治算法 求第k小元素 O(n) O(nlog2^n)

    BFPRT算法:时间复杂度O(n)求第k小的数字(分治算法+快排) 各位小伙伴,由于本篇文章代码太过杂乱.我于 2018年12月25日 对文中介绍的算法进行了重写.点击上面的蓝色字体,可以阅读重写后的 ...

  8. BFPRT算法:时间复杂度O(n)求第k小的数字(分治算法+快排)

    我自己搭建了博客,以后可能不太在CSDN上发博文了,https://www.qingdujun.com/ . 去年写了一篇<分治算法 求第kkk小元素 O(n)O(n)O(n) & O( ...

  9. B站哔哩哔哩21届秋招算法岗笔试 假设货币系统包含面值1元、4元、16元、64元共计4种硬币,以及面值1024元的纸币。现在小明使用1024元的纸币购买了一件价值为N(0<N<=1024)的商品

    哔哩哔哩21届秋招算法岗笔试 题目描述: 假设货币系统包含面值1元.4元.16元.64元共计4种硬币,以及面值1024元的纸币.现在小明使用1024元的纸币购买了一件价值为N(0<N<=1 ...

最新文章

  1. java数据库初始化参数,oracle数据库初始化参数设置--Java免费学习网
  2. 用户思维模型,围绕用户核心四大模块,拉新、养熟、成交、裂变循环的效果...
  3. CTF:攻防世界web PART01
  4. Ruby中对应PHP的hex2bin和bin2hex方法
  5. 16进制发送 mqtt客户端调试工具_MQTT客户端调试工具(MQTT Simulate Device)
  6. phpcms手机端去掉index.php,如何取消phpcms v9手机门户中文章详情页模板中内容被自动分页...
  7. 常见计算机密码破解实用手册
  8. 博世BMI160六轴传感器I2C通信配置
  9. java合并2个txt文本,Java实现多个文档合并输出到一个文档
  10. EtherCAT从站协议栈代码笔记之ecat_def.h
  11. Unity3D之简单AR游戏
  12. html怎么设置页脚注释,Word写论文时怎么插入页脚注释?
  13. Kotlin - 改良迭代器模式
  14. EditPluss有效激活码
  15. 计算机与资源管理器有何区别,资源管理器与我的电脑有什么不同.PPT
  16. HTML下拉菜单怎么做成横向,JQuery实现绚丽的横向下拉菜单
  17. 威洛特:狗狗乱咬东西都是有原因的
  18. Codeforces 1087 - 题集
  19. Linux基本常用命令|ubuntu获取root权限
  20. java线程之生产者与消费者

热门文章

  1. 20175201张驰 实验四 Android 开发
  2. 评测回顾 | 南大通用分布式事务型数据库产品GBase 8c
  3. 什么是co-saliency?
  4. 广东省城市环境空气质量状况数据集(2014年1月-2022年5月)
  5. 单词测试通关学英语的软件,学习软件有哪些,给大家推荐一款靠谱的 | 外教英评网...
  6. android shell 定位 命令,【Adb shell】---玩转 Android系统 查询 应用包名 命令
  7. [洛谷月赛]终于结束的起点
  8. c++双人战争小游戏
  9. 简约大气体积小的影视源码
  10. 感受大自然帶給我們的愉悅心情