hdu 2514 Another Eight Puzzle

  题目的大意就是,给你八个圆圈,将1~8这些数字填入圈中。这些圆圈之中,有些圈是互相连通的,相互连接的圆圈所填入的数字只差不能等于1。

  输入数据中为0的地方是我们需要我们填入数字的。

  从题目要求我们可以知道就是一个搜索题,用dfs直接搜所有的解,第一次搜到解时,保存下来,如果再一次搜到,就说明解不唯一,则直接退出。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
bool mp[10][10];
int ans[10],vis[10];
int num[10],sum;
bool isUnique,flag;
int iabs(int n)
{
    return n>0?n:-n;
}
void createMap()
{
    memset(mp,false,sizeof(mp));
    for(int i=1; i<=8; i++)
        mp[i][i]=true;
    mp[1][2]=mp[2][1]=true;
    mp[1][3]=mp[3][1]=true;
    mp[1][4]=mp[4][1]=true;
    mp[2][3]=mp[3][2]=true;
    mp[2][5]=mp[5][2]=true;
    mp[2][6]=mp[6][2]=true;
    mp[3][4]=mp[4][3]=true;
    mp[3][5]=mp[5][3]=true;
    mp[3][6]=mp[6][3]=true;
    mp[3][7]=mp[7][3]=true;
    mp[4][6]=mp[6][4]=true;
    mp[4][7]=mp[7][4]=true;
    mp[5][6]=mp[6][5]=true;
    mp[6][7]=mp[7][6]=true;
    mp[6][8]=mp[8][6]=true;
    mp[7][8]=mp[8][7]=true;
}
void init()
{
    memset(vis,0,sizeof(vis));
    sum=0;
    isUnique=true;
    flag=false;
    for(int i=1; i<=8; i++)
    {
        scanf("%d",&num[i]);
        if(num[i]!=0)++sum;
        vis[num[i]]=true;
    }
}
bool check(int x,int y)
{
    for(int i=1; i<=8; i++)
    {
        if(!num[i])continue;
        if(mp[x][i] && iabs(num[i]-y)==1)return false;
    }
    return true;
}
bool dfs(int cur,int n)
{
    if(n+sum==8)
    {
        if(flag)
        {
            isUnique=false;
            return true;
        }
        else
        {
            flag=true;
            for(int i=1; i<=8; i++)
                ans[i]=num[i];
            return false;
        }
    }
    for(int i=cur; i<=8; i++)
    {
        if(num[i])continue;
        for(int j=1; j<=8; j++)
        {
            if(vis[j])continue;
            if(!check(i,j))continue;
            vis[j]=true;
            num[i]=j;
            if(dfs(cur+1,n+1))return true;
            vis[j]=false;
            num[i]=0;
        }
        break;
    }
    return false;
}
void solve()
{
    init();
    dfs(1,0);
    if(flag)
    {
        if(isUnique)
        {
            for(int i=1; i<=8; i++)
                printf(" %d",ans[i]);
        }
        else printf(" Not unique");
    }
    else printf(" No answer");
    printf("\n");

}

int main()
{
    int t,cas=0;
  //  freopen("in.txt","r",stdin);
    scanf("%d",&t);
    createMap();
    while(cas++<t)
    {
        printf("Case %d:",cas);
        solve();
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在信号处理领域,DOA(Direction of Arrival)估计是一项关键技术,主要用于确定多个信号源到达接收阵列的方向。本文将详细探讨三种ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)算法在DOA估计中的实现,以及它们在MATLAB环境中的具体应用。 ESPRIT算法是由Paul Kailath等人于1986年提出的,其核心思想是利用阵列数据的旋转不变性来估计信号源的角度。这种算法相比传统的 MUSIC(Multiple Signal Classification)算法具有较低的计算复杂度,且无需进行特征值分解,因此在实际应用中颇具优势。 1. 普通ESPRIT算法 普通ESPRIT算法分为两个主要步骤:构造等效旋转不变系统和估计角度。通过空间平移(如延时)构建两个子阵列,使得它们之间的关系具有旋转不变性。然后,通过对子阵列数据进行最小二乘拟合,可以得到信号源的角频率估计,进一步转换为DOA估计。 2. 常规ESPRIT算法实现 在描述中提到的`common_esprit_method1.m`和`common_esprit_method2.m`是两种不同的普通ESPRIT算法实现。它们可能在实现细节上略有差异,比如选择子阵列的方式、参数估计的策略等。MATLAB代码通常会包含预处理步骤(如数据归一化)、子阵列构造、旋转不变性矩阵的建立、最小二乘估计等部分。通过运行这两个文件,可以比较它们在估计精度和计算效率上的异同。 3. TLS_ESPRIT算法 TLS(Total Least Squares)ESPRIT是对普通ESPRIT的优化,它考虑了数据噪声的影响,提高了估计的稳健性。在TLS_ESPRIT算法中,不假设数据噪声是高斯白噪声,而是采用总最小二乘准则来拟合数据。这使得算法在噪声环境下表现更优。`TLS_esprit.m`文件应该包含了TLS_ESPRIT算法的完整实现,包括TLS估计的步骤和旋转不变性矩阵的改进处理。 在实际应用中,选择合适的ESPRIT变体取决于系统条件,例如噪声水平、信号质量以及计算资源。通过MATLAB实现,研究者和工程师可以方便地比较不同算法的效果,并根据需要进行调整和优化。同时,这些代码也为教学和学习DOA估计提供了一个直观的平台,有助于深入理解ESPRIT算法的工作原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值