华师一附中OI组
标题:
20151025讲义
[打印本页]
作者:
diggersun
时间:
2015-10-25 13:52
标题:
20151025讲义
1、错排问题
#include<iostream>
using namespace std;
int a[5],s=0;
bool b[5];
void mysearch(int i)
{
int j,k;
if (i==5) {cout<<++s<<":";for (j=0;j<=4;j++) cout<<a[j];cout<<endl;}
else for (k=0;k<=4;k++)
if (b[k] && i!=k) {a[i]=k;b[k]=false;mysearch(i+1);b[k]=true;}
}
int main()
{
for (int i=0;i<=4;i++) b[i]=true;
mysearch(0);
return 0;
}
复制代码
作者:
diggersun
时间:
2015-10-25 14:05
2、3个A 2个B 1个C 1个D 1个E全排列
#include<iostream>
using namespace std;
const string ss="ABCDE";
int a[8],s=0;
int b[5];
void mysearch(int i)
{
int j,k;
if (i==8) {cout<<++s<<":";for (j=0;j<=7;j++) cout<<ss[a[j]];cout<<endl;}
else for (k=0;k<=5;k++)
if (b[k]>0) {a[i]=k;b[k]--;mysearch(i+1);b[k]++;}
}
int main()
{
b[0]=3;b[1]=2;b[2]=b[3]=b[4]=1;
mysearch(0);
return 0;
}
复制代码
作者:
diggersun
时间:
2015-10-25 14:23
间隔排列
#include<iostream>
using namespace std;
const int n=3;
int a[2*n],s=0;
bool b[n];
void mysearch(int i)
{
int j,k;
if (i==2*n)
{
cout<<++s<<":";
for (j=0; j<=2*n-1; j++) cout<<a[j];
cout<<endl;
}
else if (a[i]!=-1) mysearch(i+1);
else for (k=0; k<=n-1; k++)
if (b[k] && (i+k+2<=2*n-1) && (a[i+k+2]==-1))
{
a[i]=a[i+k+2]=k;
b[k]=false;
mysearch(i+1);
b[k]=true;
a[i]=a[i+k+2]=-1;
}
}
int main()
{
for (int i=0; i<=2*n-1; i++) a[i]=-1;
for (int i=0; i<=n-1; i++) b[i]=true;
mysearch(0);
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2