[传智杯 #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;
}