用递归写全排列
#include <iostream>
using namespace std;
int n;
int aa[3]={1,2,3};
int bb[3];
int s[3]={0};
void dfs(int a)
{
if(a==3)
{
for(int i=0;i<3;i++)
{
cout<<bb[i];
}
cout<<endl;
return;
}
else
{
for(int i=0;i<3;i++)
{
if(!s[i])
{
bb[a]=aa[i];
s[i]=1;
dfs(a+1);
s[i]=0;
}
}
}
}
int main()
{
dfs(0);
return 0;
}
神奇的递归,循环解决不了啊。
试题D:飞机降落
【问题描述】
N 架飞机准备降落到某个只有一条跑道的机场。其中第 i 架飞机在 Ti 时刻
到达机场上空,到达时它的剩余油料还可以继续盘旋 Di 个单位时间,即它最早
可以于 Ti 时刻开始降落,最晚可以于 Ti + Di 时刻开始降落。降落过程需要 Li
个单位时间。
一架飞机降落完毕时,另一架飞机可以立即在同一时刻开始降落,但是不
能在前一架飞机完成降落前开始降落。
请你判断 N 架飞机是否可以全部安全降落。
【输入格式】
输入包含多组数据。
第一行包含一个整数 T,代表测试数据的组数。
对于每组数据,第一行包含一个整数 N。
以下 N 行,每行包含三个整数:Ti,Di 和 Li。
【输出格式】
对于每组数据,输出 YES 或者 NO,代表是否可以全部安全降落。
【样例输入】
2
3
0 100 10
10 10 10
0 2 20
3
0 10 20
10 10 20
20 10 20
【样例输出】
YES
NO
【样例说明】
对于第一组数据,可以安排第 3 架飞机于 0 时刻开始降落,20 时刻完成降
落。安排第 2 架飞机于 20 时刻开始降落,30 时刻完成降落。安排第 1 架飞机
于 30 时刻开始降落,40 时刻完成降落。
对于第二组数据,无论如何安排,都会有飞机不能及时降落。
【评测用例规模与约定】
对于 30% 的数据,N ≤ 2。
对于 100% 的数据,1 ≤ T ≤ 10,1 ≤ N ≤ 10,0 ≤ Ti, Di, Li ≤ 10
这个题由于基数不大,我们直接全排列分别试一试。
#include <iostream>
using namespace std;
int m=5;
int* bb = new int[m];
int* s = new int[m];
int* t = new int[m];
int* d = new int[m];
int* l = new int[m];
int flag;
void dfs(int a)
{
if(a==m)
{ int flag1=0;
int time=0;
for(int i=0;i<m-1;i++)
{
if(time<t[bb[i]])
{
time=t[bb[i]]+l[bb[i]];
}
else
{
time=time+l[bb[i]];
}
if(time>t[bb[i+1]]+d[bb[i+1]])
{
flag1=1;
break;
}
}
if(!flag1)
{
flag=1;
}
return;
}
else
{
for(int i=0;i<m;i++)
{
if(!s[i])
{
bb[a]=i;
s[i]=1;
dfs(a+1);
s[i]=0;
}
}
}
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>m;
flag=0;
for(int j=0;j<m;j++)
{
cin>>t[j]>>d[j]>>l[j];
}
for(int i=0;i<m;i++)
{
s[i]=0;
}
dfs(0);
if(flag==1)
{
cout<<"yes"<<endl;
}
else
cout<<"no"<<endl;
}
return 0;
}
除了思路之外,还有全局变量的设置和动态数组的建立是难点。包括时间的计算等等。