【数据结构】打开转盘锁 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

原文地址:https://www.cnblogs.com/dreamtaker/p/15376759.html