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

源码直接下载地址: https://pan.quark.cn/s/a4b39357ea24 过采样与欠采样构成了数字信号处理领域中两种基础的采样策略,它们在工程实践应用时各自展现出独特的长处与短处及适用情境。以下将深入阐释这两种采样方法的运作机制,并对它们在实际操作中的区别进行细致对比。 我们首先阐释过采样的核心概念。过采样(Oversampling)一般是指运用高于必要标准频率对模拟信号实施采样。举例而言,当信号频率为70MHz且信号带宽为20MHz时,依据奈奎斯特采样准则,理论上采样频率只需略高于40MHz(即信号带宽频率的两倍)即可达成无失真采样。然而,在现实操作中,系统构造者常常会采用超过140MSPS(每秒百万次采样)的采样速率,这通常超出理论所需。过采样的主要不利之处涵盖:提升ADC输出数据速率,引发FPGA的时序挑战;增大功耗、ADC及FPGA的制造成本。尽管存在这些不足,过采样依然具备其有利之处,例如可提供处理增益、频率规划的伸缩性以及能够处理更宽的信号带宽。 接下来,我们探讨欠采样的基本原理。欠采样(Undersampling)是指以低于理论标准频率对信号进行采样,这在处理高输入信号频率时尤为有效。例如,针对70MHz的中频(IF)信号,通过欠采样能够采用低于40MHz的采样频率进行采样,从而将数据速率降至FPGA,减少时序挑战,节省能量消耗和成本。实现欠采样的关键设计考量在于它能够在系统设计中达成所需的ADC动态性能。 欠采样的优势体现为能够简化硬件构造,比如降低对高速数据捕获的需求,并且在设计条件允许时,可选用较慢的ADC来削减成本。然而,欠采样技术也存在其局限性,例如在ADC的非理想表现可能导致非线性失真,诸如二阶(HD2)和三阶(HD3)谐...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值