//总体思路:从一号牌开始(循环A),依次往后(循环B)找牌数大于一号的。
//循环B里的符合要求的都是最底层的牌。
//被标记过的都是被移动过的牌,也确定都不是最底层的牌。
import java.util.Scanner;
public class Main {
static int m;
static int[] num = new int[11];//每一种数组的排列方式代表一种状态
static int sum2 = 999999999;
static boolean vis[] = new boolean[11];
public static void main(String args[]) {
Scanner scan = new Scanner(System.in);
m = scan.nextInt();
while(m>0) {
m-=1;
scan.nextLine();
for(int j=1;j<=10;j++) {
int a = scan.nextInt();
num[a] = j ;//这个数组是记录每一个牌号的位置
}
init();
//然后就可以dfs了
dfs(0,0);//传两个参数 总和sum 和 牌的位置
System.out.println(sum2);
}
}
public static void dfs(int sum,int count) {
//先设计出口
if(sum > sum2)return;//提前剪枝
if(count >= 9) {
sum2 = sum;
//System.out.println(sum);
return;
}
for(int i=1;i<10;i++) {
if(!vis[i]) {
for(int j=i+1;j<=10;j++) {//找到牌i能移到的牌
if(!vis[j]) {
vis[i]=true;
dfs(sum+abs(num[j]-num[i]),count+1);
break;
}
}
vis[i]=false;//回溯
}
}
}
public static int abs(int a){
return a>0?a:-a;
}
public static void init() {
for(int k=1;k<=10;k++) {
vis[k] = false;
}
}
}
点月♡
发布了3 篇原创文章 · 获赞 1 · 访问量 26
私信
关注
标签:hdu,java,scan,int,sum,sum2,dfs,static,public
来源: https://blog.csdn.net/qq_45068396/article/details/104535924