Problem:排队
Description
小Q是班长。在校运动会上,小Q班要进行队列表演。小Q要选出2*N名同学编队,每人都被编上一个号,每一个从1到N的自然数都被某2名同学佩戴,现在要求将他们排成一列,使两个编号为1的同学中间恰好夹1名同学,两个编号为2的同学中间恰好夹2名同学,……,两个编号为N的同学中间恰好夹N名同学,小Q希望知道这样的排法能否实现。
Input
输入文件仅包括一行,即要处理的N。N<=13
Output
输出有多少种排列顺序.
Sample Input
3
Sample Output
2
这道题先读题,可以得到以3为例的数组:
312132(这只是一种)
求有几种解法。
看代码理解:
#include<bits/stdc++.h>//可爱的万能头
using namespace std;
int n,ans=0;//几个数,计数
bool used[30]={false};//打标,先全定false
void find(int dep)//搜索
{
if(dep>n)//如果大于n就计数
{
ans++;
return;
}
for(int i=1;i<=2*n-dep-1;i++)//由1为例可得(1的对应点为n+n+1-起点)搜索
{
if(!used[i]&&!used[i+dep+1])
{
used[i]=used[i+dep+1]=true;//打标
find(dep+1);//搜索下一个数
used[i]=used[i+dep+1]=false;//去标
}
}
}
int main()
{
cin>>n;
find(1);
cout<<ans<<endl;//输出
return 0; //完美的结束
}
这道题的关键在于如何去搜索对应点这是非常重要的,加上一点基础的代码能力就能解决(想多了),嗯大概就是这样。
大家都懂:
#include<bits/stdc++.h>
using namespace std;
int n,ans=0;
bool used[30]={false};
void find(int dep)
{
if(dep>n)
{
ans++;
return;
}
for(int i=1;i<=2*n-dep-1;i++)
{
if(!used[i]&&!used[i+dep+1])
{
used[i]=used[i+dep+1]=true;
find(dep+1);
used[i]=used[i+dep+1]=false;
}
}
}
int main()
{
cin>>n;
find(1);
cout<<ans<<endl;
return 0;
}
喜欢樱花的留下一个评论关注吧!!
蟹蟹!!