打开转盘锁 Open the Lock

打开转盘锁 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以通过 HTML、CSS 和 JavaScript 实现转盘效果。下面是一个简单的 HTML 转盘实现示例: ```html <!DOCTYPE html> <html> <head> <title>HTML 转盘示例</title> <style> /* 定义转盘样式 */ .wheel { width: 300px; height: 300px; margin: 50px auto; position: relative; overflow: hidden; border-radius: 50%; box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.5); } .wheel:before { content: ""; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: linear-gradient(to right, #fff 50%, #f00 50%); transform-origin: 0 50%; transform: rotate(22.5deg); transition: transform 5s; } </style> </head> <body> <div class="wheel"></div> <script> // 定义转盘旋转函数 function spinWheel() { // 随机生成旋转角度 var deg = Math.floor(Math.random() * 360) + 3600; // 获取转盘元素 var wheel = document.querySelector(".wheel"); // 设置转盘旋转动画 wheel.style.transition = "transform 10s ease-out"; wheel.style.transform = "rotate(" + deg + "deg)"; // 监听旋转动画结束事件 wheel.addEventListener("transitionend", function() { // 移除旋转动画 wheel.style.transition = null; // 计算选中的扇形 var selected = Math.floor(((360 - deg % 360) % 360) / 45); // 弹出选中的扇形编号 alert(selected); }); } // 绑定转盘点击事件 document.querySelector(".wheel").addEventListener("click", function() { // 禁用转盘点击事件 this.removeEventListener("click", arguments.callee); // 开始转盘旋转 spinWheel(); }); </script> </body> </html> ``` 该示例中,通过定义 `.wheel` 样式来设置转盘的基本样式,然后使用 `:before` 伪元素来绘制扇形。在 JavaScript 中,定义了 `spinWheel()` 函数来实现转盘旋转效果,并在转盘点击事件中调用该函数来触发旋转动画。旋转结束后,通过计算旋转角度来确定选中的扇形,弹出选中扇形的编号。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Eric.Cui

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

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

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

打赏作者

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

抵扣说明:

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

余额充值