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

  • 相关阅读:
    UITableView 总结
    关于UIView的autoresizingMask属性的研究
    支付开发
    202011.11
    202011.10
    202011.09
    养成一个习惯,每天写博客,不放假就不变
    html重置功能
    echart折线图插件图片的宽度和页面的自适应
    点击使文字变文本框且可编辑的JS
  • 原文地址:https://www.cnblogs.com/dreamtaker/p/15376759.html
Copyright © 2020-2023  润新知