AcWing - 98 - 分形之城

本文深入探讨了一种用于完全图遍历的递归算法,通过定义四个基本方向的递归函数U(上)、D(下)、L(左)、R(右),实现了对任意大小的完全图的有效遍历。算法通过递归调用自身,根据不同条件选择下一个遍历的方向,最终形成一条覆盖整个图的路径。特别地,算法还展示了如何从指定起点开始遍历,并返回路径上的所有点坐标。

https://www.acwing.com/problem/content/100/

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

void U(ll, ll, int, ll, ll, ll, ll);
void D(ll, ll, int, ll, ll, ll, ll);
void R(ll, ll, int, ll, ll, ll, ll);

vector<pair<ll, ll> >ans;
//len是完全图里当前区域的边长的1/2
void L(ll x, ll y, int n, ll id, ll idl, ll idr, ll len) {
    if(n == 0) {
        ans.push_back({x, y});
        return;
    }
    ll idlen = (idr - idl) / 4;
    if(id < idl + idlen)
        U(x, y, n - 1, id, idl, idl + idlen, len / 2);
    else if(id < idl + 2 * idlen)
        L(x, y + len, n - 1, id, idl + idlen, idl + 2 * idlen, len / 2);
    else if(id < idl + 3 * idlen)
        L(x + len, y + len, n - 1, id, idl + 2 * idlen, idl + 3 * idlen, len / 2);
    else
        D(x + len, y, n - 1, id, idl + 3 * idlen, idl + 4 * idlen, len / 2);
}

//len是完全图里当前区域的边长的1/2
void U(ll x, ll y, int n, ll id, ll idl, ll idr, ll len) {
    //printf("U[%lld,%lld,%d],[%lld,%lld]\n", x, y, n,idl,idr-1);
    if(n == 0) {
        ans.push_back({x, y});
        return;
    }
    ll idlen = (idr - idl) / 4;
    if(id < idl + idlen)
        L(x, y, n - 1, id, idl, idl + idlen, len / 2);
    else if(id < idl + 2 * idlen)
        U(x + len, y, n - 1, id, idl +  idlen, idl + 2 * idlen, len / 2);
    else if(id < idl + 3 * idlen)
        U(x + len, y + len, n - 1, id, idl + 2 * idlen, idl + 3 * idlen, len / 2);
    else
        R(x, y + len, n - 1, id, idl + 3 * idlen, idl + 4 * idlen, len / 2);
}

//len是完全图里当前区域的边长的1/2
void R(ll x, ll y, int n, ll id, ll idl, ll idr, ll len) {
    //printf("R[%lld,%lld,%d],[%lld,%lld]\n", x, y, n,idl,idr-1);
    if(n == 0) {
        ans.push_back({x, y});
        return;
    }
    ll idlen = (idr - idl) / 4;
    if(id < idl + idlen)
        D(x + len, y + len, n - 1, id, idl, idl + idlen, len / 2);
    else if(id < idl + 2 * idlen)
        R(x + len, y, n - 1, id, idl + idlen, idl + 2 * idlen, len / 2);
    else if(id < idl + 3 * idlen)
        R(x, y, n - 1, id, idl + 2 * idlen, idl + 3 * idlen, len / 2);
    else
        U(x, y + len, n - 1, id, idl + 3 * idlen, idl + 4 * idlen, len / 2);
}

//len是完全图里当前区域的边长的1/2
void D(ll x, ll y, int n, ll id, ll idl, ll idr, ll len) {
    //printf("D[%lld,%lld,%d],[%lld,%lld]\n", x, y, n,idl,idr-1);
    if(n == 0) {
        ans.push_back({x, y});
        return;
    }
    ll idlen = (idr - idl) / 4;
    if(id < idl + idlen)
        R(x + len, y + len, n - 1, id, idl, idl + idlen, len / 2);
    else if(id < idl + 2 * idlen)
        D(x, y + len, n - 1, id, idl + idlen, idl + 2 * idlen, len / 2);
    else if(id < idl + 3 * idlen)
        D(x, y, n - 1, id, idl + 2 * idlen, idl + 3 * idlen, len / 2);
    else
        L(x + len, y, n - 1, id, idl + 3 * idlen, idl + 4 * idlen, len / 2);
}

int main() {
#ifdef Yinku
    freopen("Yinku.in", "r", stdin);
#endif // Yinku
    int T;
    while(~scanf("%d", &T)) {
        while(T--) {
            ll n, x, y;
            scanf("%lld%lld%lld", &n, &x, &y);
            ans.clear();
            //len,每个四分之一块的边长
            L(1, 1, n, x, 1, (1ll << (2ll * n)) + 1ll, 1ll << (n - 1));
            L(1, 1, n, y, 1, (1ll << (2ll * n)) + 1ll, 1ll << (n - 1));
            //printf("[%lld,%lld]\n", ans[0].first, ans[0].second);
            //printf("[%lld,%lld]\n", ans[1].first, ans[1].second);
            double dx = abs(ans[0].first - ans[1].first) * 10.0;
            double dy = abs(ans[0].second - ans[1].second) * 10.0;
            double dis = sqrt(dx * dx + dy * dy);
            printf("%lld\n", (ll)round(dis));
        }
    }
}

转载于:https://www.cnblogs.com/Inko/p/11424782.html

通过短时倒谱(Cepstrogram)计算进行时-倒频分析研究(Matlab代码实现)内容概要:本文主要介绍了一项关于短时倒谱(Cepstrogram)计算在时-倒频分析中的研究,并提供了相应的Matlab代码实现。通过短时倒谱分析方法,能够有效提取信号在时间与倒频率域的特征,适用于语音、机械振动、生物医学等领域的信号处理与故障诊断。文中阐述了倒谱分析的基本原理、短时倒谱的计算流程及其在实际工程中的应用价值,展示了如何利用Matlab进行时-倒频图的可视化与分析,帮助研究人员深入理解非平稳信号的周期性成分与谐波结构。; 适合人群:具备一定信号处理基础,熟悉Matlab编程,从事电子信息、机械工程、生物医学或通信等相关领域科研工作的研究生、工程师及科研人员。; 使用场景及目标:①掌握倒谱分析与短时倒谱的基本理论及其与傅里叶变换的关系;②学习如何用Matlab实现Cepstrogram并应用于实际信号的周期性特征提取与故障诊断;③为语音识别、机械设备状态监测、振动信号分析等研究提供技术支持与方法参考; 阅读建议:建议读者结合提供的Matlab代码进行实践操作,先理解倒谱的基本概念再逐步实现短时倒谱分析,注意参数设置如窗长、重叠率等对结果的影响,同时可将该方法与其他时频分析方法(如STFT、小波变换)进行对比,以提升对信号特征的理解能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值