package 宽度优先搜索;
import java.util.*;
public class Code_bfs2打开转盘锁 {
public static int bfs(String target, String[] deadends) {
Queue<String> q = new LinkedList<String>();
Set<String> set = new HashSet<String>();
List<String> list = Arrays.asList(deadends); // 转到这个数组中的任何数都会被锁死
String start = "0000";
int step = 0;
if(start.equals(target)) { // 字符串比较时还是要用 equals
return step;
}
if(list.contains(target)) {
return -1;
}
q.offer(start);
set.add("0000");
while(!q.isEmpty()) {
step++; // 注意这个step的位置
int size = q.size();
for(int i = 0; i < size; i++) {
String now = q.peek();
if(now.equals(target)) {
return step;
}
String[] neibor = getNeibor(now);
for(String nei : neibor) {
if(set.contains(nei) == false && list.contains(nei) == false) {
q.offer(nei);
set.add(nei);
}
}
if(q.contains(target)) { // 看在这一次的搜索中有没有target
return step;
}
q.poll();
}
}
return -1;
}
private static String[] getNeibor(String now) {
String[] res = new String[8]; // 因为这个转盘每一次只能转一次所以我们对每一个扭 +1或者-1
for(int i = 0; i < 4; i++) {
char[] ch = now.toCharArray(); // 将now的每一位拨动
int a = ch[i] - '0'; // 当这个位置上是0时减1就会变成9
if(a == 0) {
ch[i] = '9';
}else {
ch[i] = Character.forDigit(a - 1, 10); // forDigit 将a-1表示成10进制的chara
}
res[2 * i] = String.valueOf(ch);
if(a == 9) {
ch[i] = '0';
}else {
ch[i] = Character.forDigit(a + 1, 10);
}
res[2 * i + 1] = String.valueOf(ch);
}
return res;
}
public static void main(String[] args) {
String[] d = {"0201", "0000"};
System.out.println(bfs("8888", d));
}
}
2019-05-23打开转盘锁
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 题目: 你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字:'0', '1', '2', '3', '4',...
- 前言:原油本周截止到现在,累积抓住43.7美金利润空间,EIA原油库存提前5分钟布局,抓住15美金空间,实力验证。...
- 一、疗法介绍: 连环锁一病一锁之开锁疗法是以道家气血学说、阴阳学说、中医脏腑理论,结合现代医学、人体空间自然医学,...
- 这是2019年4月5日“崔律.100天精力和时间管理训练营”第4.5讲的课后实践 <实践事项> 观察与记录一天的精...
- [编辑][删除] 转载▼ 芭比大哥,你好啊! 就是刚才,我才完成的博文,突然因为电脑莫名其妙的关机,丢失了,弄得我...