hdu 1584 dfs 搜索 java

//总体思路:从一号牌开始(循环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;
}
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值