情侣啊,怎么刷个题都要虐狗呢,太没人性了。

 

 编号分别为1,2,…,n的n对情侣参加聚会后拍照主持人要求这n对情侣中的所有人排成一横排,

别出心裁的规定每对情侣男左女右且不得相邻;编号为1的情侣之间有1个人,

编号为2的情路之间有2个人,…,编号为8的情侣之间有8个人,

并且规定左端编号小于右端编号,问所有满足以上要求的不同拍照排队方式共有多少,

输出其中排左端为1同时排右端n的排队方式。试对一般n对情侣拍照进行设计。

例如n=3时的一种拍照排队为“231213”

 

轻松的解决了,让你们虐狗的:

import java.util.Scanner;

public class 照相 {

/*题意:有n*2个坑,要将1~n个数放到这些坑中,并且有那个关系
*
* 分析:第一个坑可以放1~n,所以遍历k,范围是(1~n)试探着入坑,
* 因为那个关系可知,data[k]=data[k+i+1],
* 并且将放进去的k,在数组中标记为已经使用的
*
* 然后同样的道理放第二个坑,第三个坑。。。所以递归出来了
*
* */
static int n;
static boolean[] vis;
public static void main(String[] args) {

Scanner sc=new Scanner(System.in);
n=sc.nextInt();
vis=new boolean[n+1];
int[] data=new int[n*2];
f(0,data);

}

private static void f(int k, int[] data) {

if(k==n*2-1){
for (int i = 0; i < data.length; i++) {
System.out.print(data[i]);
}
System.out.println();
return;
}

for (int i = 1; i <= n; i++) {

if(data[k]!=0){
f(k+1,data);
return;
}
else if(!vis[i]&&(k+i+1)<n*2&&(data[k]==0&&data[k+i+1]==0)){

data[k]=i;
data[k+i+1]=i;
vis[i]=true;

f(k+1,data);

vis[i]=false;
data[k+i+1]=0;
data[k]=0;
}
}
}
}