XOJ 骑士精神

本文介绍了一种改进的深度优先搜索(ID_DFS)算法,该算法用于解决特定的棋盘类问题。通过实现剪枝策略来提高搜索效率,避免了不必要的计算,从而减少了时间复杂度。代码示例展示了如何通过交换棋盘上的元素位置来寻找从初始状态到目标状态的最短路径。

ID_DFS >o<
需要加剪枝,如果当前有n个格子与目标不同,那么如果dep+n-1还大于maxdep,一定要坚决抛弃这种害人TLE的情况O(∩_∩)O!


代码如下

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
string str;
int cas,chess[6][6],goal[6][6],blank[3],maxdep;
bool judge(){
    for(int i=1;i<=5;i++)
        for(int j=1;j<=5;j++)
            if(chess[i][j]!=goal[i][j])
                return false;
    return true;
}
bool qs(int dep){
    for(int i=1;i<=5;i++)
        for(int j=1;j<=5;j++)
            if(chess[i][j]!=goal[i][j]){
                dep++;//如果有n个格子不同,最少需要走n-1步 
                if(dep-1>maxdep)
                    return false;
            }
    return true;
}
bool ID_DFS(int dep){
    if(dep>maxdep)
        return false;
    for(int i=blank[1]-2;i<=blank[1]+2;i++){
        if(i<1||i>5||i==blank[1])
            continue;//防止越界+剪枝 
        for(int j=blank[2]-2;j<=blank[2]+2;j++){
            if(j<1||j>5||j==blank[2])
                continue;
            if(abs(i-blank[1])*abs(i-blank[1])+abs(j-blank[2])*abs(j-blank[2])==5){
                swap(chess[i][j],chess[blank[1]][blank[2]]);
                int a=blank[1],b=blank[2];
                blank[1]=i,blank[2]=j;
                if(judge())
                    return true;
                if(qs(dep))
                    if(ID_DFS(dep+1))
                        return true;
                swap(chess[i][j],chess[a][b]),blank[1]=a,blank[2]=b;
            }
        }
    }
    return false;
}
int main(){
    cin>>cas,memset(goal,0,sizeof(goal));
    for(int i=1;i<=4;i++)
        for(int j=5;j>=i;j--)
            goal[i][j]=1;
    goal[3][3]=2,goal[4][4]=0;
    while(cas--){
        for(int i=1;i<=5;i++){
            cin>>str;
            for(int j=1;j<=5;j++){
                if(str[j-1]=='1')
                    chess[i][j]=1;
                else if(str[j-1]=='0')
                    chess[i][j]=0;
                else if(str[j-1]=='*')
                    chess[i][j]=2,blank[1]=i,blank[2]=j;
            }
        }
        int flag=0;
        for(int i=1;i<=15;i++){
            maxdep=i;
            if(ID_DFS(1)){
                cout<<maxdep<<endl,flag=1;
                break;
            }
        }
        if(!flag)
            cout<<-1<<endl;
    }
    return 0;
} 

by >o< neighthorn

内容概要:本文围绕可变桨叶四旋翼无人机的规范控制与点对点运动模拟展开,重点研究优化推力分配策略在翻转动作中的应用与性能比较。通过Matlab代码实现,构建了四旋翼动力学模型,并设计了多种控制算法以实现精确的姿态调整与轨迹跟踪。研究对比了不同推力分配方案在执行高机动性翻转动作时的稳定性、能耗效率与响应速度,旨在提升无人机在复杂飞行任务中的动态性能与控制精度。该仿真研究为无人机飞控系统的设计与优化提供了理论依据和技术支持。; 适合人群:具备一定自动控制理论基础和Matlab编程能力,从事无人机控制、飞行器动力学或机器人系统研究的科研人员及研究生。; 使用场景及目标:① 实现四旋翼无人机在三维空间中的精确点对点运动控制;② 对比分析不同推力分配策略在执行翻转等高难度动作时的控制效果与能耗表现,优化飞行性能;③ 为无人机自主飞行、特技飞行及复杂环境下的机动控制提供算法验证平台。; 阅读建议:此资源以Matlab仿真为核心,建议读者结合相关控制理论知识,深入理解代码实现细节,重点关注动力学建模、控制律设计与推力分配模块。在学习过程中,应动手调试参数,复现文中翻转动作的仿真结果,并尝试拓展至其他复杂飞行任务,以加深对无人机控制机理的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值