打开转盘锁 Open the Lock

该博客探讨了一个使用广度优先搜索(BFS)算法解决转盘锁谜题的问题。给定一个4个转轮的锁,每个转轮有10个数字,目标是找到从初始状态'0000'到目标数字的最小旋转次数,同时避开一系列死亡数字。博客中提供了Data类和getStr()方法来处理数字的旋转,并通过openLock()函数实现了BFS搜索。在给定的例子中,目标是'0202',解决方案需要6次旋转。
摘要由CSDN通过智能技术生成

打开转盘锁 Open the Lock

有一个带4个圆形转轮的转盘锁,每个转轮有10个数字 0-9,转轮可以自由转。每次旋转只能转一个转轮的一个数字。

初始数字为0000,一个代表4个转轮数字的字符串。

列表deadends标识了一组死亡数字,一旦转轮转到了这个列表中的任何数字,锁就无法再次转动,被永久锁定。

字符串target代表可以解锁的数字,求解锁需要的最小旋转次数,否则返回-1.

deadends = ["0201","0101","0102","1212","2002"], target = "0202"
out:6

思路

使用BFS,4个转轮,每次只能动一个转轮, 一个转轮一次动一位。

处理数字要注意

public class Data{
	String s;
	
	int v;
	Data(String str, int val){
		s= str;
		v = val;
	}
}

public String getStr(String str ,int i,int j){
	char[] arr = str.toCharArray();
	
	switch(j){
		case 0:
			arr[i]-=1;
			break;
		case 1:
			arr[i]+=1;
			break;
	};
	if(arr[i]<'0'){
		arr[i]='9';
	}
	if(arr[i]>'9'){
		arr[i]='0';
	}
	return new String(arr);
}

public int openLock(String[] deadends, String target) {
	HashSet<String> set = new HashSet<String>();
	for(int i=0;i<deadends.length;i++){
		set.add(deadends[i]);
	}
	Queue<Data> queue = new LinkedList<Data>();
	if(set.contains("0000")){
		return -1;
	}
	queue.offer(new Data("0000",0));
	set.add("0000");
	while(!queue.isEmpty()){
		Data t = queue.peek();
		if(target.equals(t.s)){
			return t.v;
		}
		for(int i =0;i<4;i++){
			for(int j=0;j<2;j++){
				String s = getStr(t.s,i,j);
				if(set.contains(s)){
					continue;
				}
				set.add(s);
				queue.offer(new Data(s,t.v+1));
			}
		}
		queue.poll();
	}
	return -1;
}

Tag

BFS

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eric.Cui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值