情侣啊,怎么刷个题都要虐狗呢,太没人性了。
编号分别为1,2,…,n的n对情侣参加聚会后拍照主持人要求这n对情侣中的所有人排成一横排,
别出心裁的规定每对情侣男左女右且不得相邻;编号为1的情侣之间有1个人,
编号为2的情路之间有2个人,…,编号为8的情侣之间有8个人,
并且规定左端编号小于右端编号,问所有满足以上要求的不同拍照排队方式共有多少,
输出其中排左端为1同时排右端n的排队方式。试对一般n对情侣拍照进行设计。
例如n=3时的一种拍照排队为“231213”
轻松的解决了,让你们虐狗的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| 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; } } } }
|