别出心裁的情侣拍照问题
原创
©著作权归作者所有:来自51CTO博客作者gx_143的原创作品,请联系作者获取转载授权,否则将追究法律责任
情侣啊,怎么刷个题都要虐狗呢,太没人性了。
编号分别为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;
}
}
}
}