import java.io.FileInputStream;
import java.util.Arrays;
import java.util.Scanner;
/**
* 题目大意:给定测试用例个数T,N栋建筑物,N层建筑物的层高为N,建筑物在一条直线上,
* 给出从直线两端看建筑物图形,求建筑物的排列方式有几种
*/
public class Soution2 {
static int T,N,count;
static int[] left,right;
static boolean[] flag;
static int[] low;
public static void main(String[] args) throws Exception {
System.setIn(new FileInputStream("src\\demo\\1.txt"));
Scanner sc = new Scanner(System.in);
T = sc.nextInt();
for (int test_case = 1; test_case <= T; test_case++) {
N = sc.nextInt();
count = 0;
left = new int[N];
right = new int[N];
low = new int[N];
flag = new boolean[N+1];
for (int i = 0; i <N; i++) {
left[i] = sc.nextInt();
}
for (int i = 0; i <N; i++) {
right[i] = sc.nextInt();
}
System.out.printf("input-->%d\n", N);
System.out.printf("input-->%s \n",Arrays.toString(left));
System.out.printf("input-->%s \n",Arrays.toString(right));
System.out.println("====================");
dfs(0);
System.out.println(count);
}
}
private static void dfs(int pos) {
if (pos>=N) {
int[] leftpic = getphoto(low,"left");
int[] rightpic = getphoto(low,"right");
// System.out.printf("-low:%s,left:%s,right:%s\n", Arrays.toString(low), Arrays.toString(leftpic),
// Arrays.toString(rightpic));
boolean compareLeft = compare(leftpic,left);
boolean compareright = compare(rightpic,right);
// System.out.printf("-low:%s,left:%s,right:%s,Bleft:%s,Bright:%s\n",
// Arrays.toString(low),
// Arrays.toString(leftpic),
// Arrays.toString(rightpic),
// compareLeft,
// compareright
// );
//
if(compareLeft&&compareright) {
count++;
}
return;
}
for(int i=1;i<=N;i++) {
if(flag[i]==false) {
low[pos] = i;
flag[i] = true;
dfs(pos+1);
flag[i] = false;
}
}
}
/**
* 比较两个数组是否相等
* @param date
* @param targer
* @return
*/
private static boolean compare(int[] date, int[] targer) {
if(Arrays.toString(date).equals(Arrays.toString(targer))) {
return true;
}
return false;
}
/**
* 得到建筑物摆列low的照相数组
* @param low
* @param dir left从左边看,right从右边看
* @return
*/
private static int[] getphoto(int[] low,String dir) {
int[] photo = new int[N];
int start = 0;
if("left".equals(dir)) {
for (int i = 0; i <N; i++) {
for (int j = start; j < low[i]; j++) {
photo[j] = low[i];
}
start = Math.max(start, low[i]);
}
}else {
for (int i = N-1; i>=0; i--) {
for (int j = start; j < low[i]; j++) {
photo[j] = low[i];
}
start = Math.max(start, low[i]);
}
}
return photo;
}
}
SW adv楼栋摆列方式(DFS+照相)
猜你喜欢
转载自blog.csdn.net/qq_28635317/article/details/115233175
今日推荐
周排行