求不含任何等差数列的排列
我们只需把原有的等差数列打乱即可
在0-n-1中最大的等差数列是0,2,4,6……和1,3,5,7……
我们加入已经他们分别打乱,就是说前面的数字排列已经无需调整了
那么我们如何避免前后两部分的数组组成等差呢
只需把他们前后分开即可,
因为从这两部分中,你不可能拿出三个数等差排列。。
代码如下:
#include <cstdio>
#define M 10010
int n, a[M], b[M];
void dfs(int s, int t)
{
int i = s;
if(s+1>=t) return;
for(int j = s; j <= t; j++) b[j] = a[j];
for(int j = s; j <= t; j+=2,i++) a[i] = b[j];
for(int j = s+1; j <= t; j+=2,i++) a[i] = b[j];
dfs(s,(s+t)/2);
dfs((s+t)/2+1,t);
}
int main ()
{
int n;
while(scanf("%d",&n),n)
{
for(int i = 0; i < n; i++) a[i] = i;
dfs(0,n-1);
printf("%d:",n);
for(int i = 0; i < n; i++) i?printf(" %d",a[i]):printf("%d",a[i]);
printf("\n");
}
return 0;
}