73 BFS解打开转盘锁

2023-12-28 01:02:33

问题描述:你有一个带有四个原型拨轮的转盘锁,每个轮盘都有10个数字:'0','1','2','3','4','5','6','7','8','9',每个轮盘可以自由旋转,例如把'9'变成'0','0'变成'9',每次训传都只能旋转一个波轮的一位数字。锁的初始数字为'0000',一个代表四个拨轮的数字字符串,列表deadends包含了一组死亡数字,一旦拨轮的数字和列表中的任何一个元素相同,这个锁将会永久锁定,无法再次被拨动,字符串target代表可以解锁的数字,你需要给出最小的旋转次数,如果无论如何都不能解锁,返回-1.

BFS求解:对于一层四个轮子都有两种方法,从而一层是8个结果,但是需要对于已经访问过得结果进行进行存储在Set中,否则会出现死循环。对于在deadends中和已经存在于set中的结果,不加入queue中。还需要将数组deadends放入数组中并加入set中,

public int minSteps(String[]deadends,String target)
{
Set<String>set=new HashSet(Arrays.asList(deadends));
Set<String>visisted=new HashSet<>();
String startStr="0000";
Queue<Integer>queue=new LInkedList<>();
???????visited.add(startStr);
int level=0;
while(!queue.isEmpty())
{
String tempStr;
int queuesize=queue.size();

for(int i=0;i<queuesize;i++)
{
tempStr=queue.poll();

if(tempStr.equals(target)){return level;}
for(int j=0;j<4;j++)
{
char ch=s.tempStr.charAt(i);
String Add=temStr.substring(0,i)+(ch=='9'?'0':ch+1)+tempStr.substring(i+1);
String Sub=temStr.substring(0,i)+(ch=='0'?'9':ch-1)+tempStr.substring(i+1);
if(!set.contains(Add)&&!visited.contains(Add)){queue.add(Add);visited.add(Add);}
if(!set.contains(Add)&&!visited.contains(Add)){queue.add(Add);visited.add(Add);}
}
}
}
return -1;
}

文章来源:https://blog.csdn.net/qq_52299902/article/details/135251759
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。