[传智杯 #3 决赛] 面试

· · 题解

思路分析

这道匹配的题,可以让数据选择设备,并且标记上这个设备已经被匹配了。

我们可以使用深度优先搜索实现,把每一种合法排列搜索一遍,第一次输出并标记上,后面搜到就不输出,然后如果没有则输出 -1

代码实现

#include<bits/stdc++.h>
using namespace std;
int n,k,a[7],b[7],p[7];
//按题目名称定义变量&数组
bool f=1,u[7];
//f用来判断是不是最小的全排列,u数组用来判断是否被使用过
void dfs(int s){
    if(s==k+1){
        if(f)
            for(int i=1;i<=n;i++)
                printf("%d ",p[i]);
        //字典序最小
        f=0;
        //标记
        return;
    }
    //边界
    for(int i=1;i<=n;i++)
        if(a[i]-b[s]>=0/*够用*/&&!u[i]/*没用过*/){
            p[s]=i,u[i]=1;
            dfs(s+1);
            u[i]=0;
            //标记是否使用过
        }
        //让每次数据匹配一个机器
    return;
}
int main(){
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)
        scanf("%d",a+i);
    for(int i=1;i<=k;i++)
        scanf("%d",b+i);
    //输入
    dfs(1);
    //深度优先搜素
    if(f)
        puts("-1");
    //没有输出-1
    return 0;
}