• 分形之城(递归)


    题目:

    image

    分析

    一般这种题都有一定得规律,根据观察可以发现, N = 2,是复制或复制旋转才得到结果。

     

    这里先说一下线性代数中旋转后的坐标计算公式

    运用矩阵乘法计算旋转后的(x , y)

    image

    然后就进行如图所示的操作

    由于图片过大无法放大,所以查看图片请访问:https://img2020.cnblogs.com/blog/1938255/202004/1938255-20200413013807377-2043893218.png

    然后写代码,递归为子问题

      1 #include <iostream>
      2 #include <algorithm>
      3 #include <cstring>
      4 #include <cmath>
      5 using namespace std;
      6 typedef long long ll;
      7 typedef pair<ll, ll> PLL;
      8 PLL calc(ll n, ll m){
      9     if(n == 0) return make_pair(0,0);
     10     ll len = 1ll << n - 1, cnt = 1ll << 2 * n -2;//len为边长的一半,cnt为一个子块的城区数 
     11     pair<ll,ll> pos = calc(n-1, m % cnt);//递归成子问题然后推出问题 
     12     ll x = pos.first, y = pos.second;
     13     ll z = m/cnt;
     14     if (z == 0) return make_pair(y,x);
     15     if (z == 1) return make_pair(x,y + len);
     16     if (z == 2) return make_pair(x + len, y + len);
     17     return make_pair(2 * len - 1 - y, len - 1 - x);
     18 
     19 }
     20 int main(){
     21     int t;
     22     cin >> t;
     23     while(t--){
     24         ll N, A, B;
     25         cin >> N >> A >> B;
     26         pair<ll,ll> ac = calc(N, A-1);//求出A-1是保证在对应的子块中 
     27         pair<ll,ll> bc = calc(N, B-1);
     28         double x = ac.first - bc.first, y = ac.second - bc.second;
     29         printf("%.0lf
    ", sqrt(x*x + y*y) * 10);
     30     }
     31     return 0;
     32 }
    追求吾之所爱
  • 相关阅读:
    算法第五章作业
    第四章实验报告
    算法第三章作业
    算法第三章上机实验报告
    算法第二章作业
    算法第二章上机实践报告
    算法 代码规范(C++)&《数学之美》读后感
    第七章学习小结
    第六章学习小结
    第五章学习小结
  • 原文地址:https://www.cnblogs.com/rstz/p/12689039.html
Copyright © 2020-2023  润新知