题解 | #数独#
开锁
http://www.nowcoder.com/practice/e7cbabbf7e0a41ec98055ee5f3d33bbe
- 使用广度优先算法:
Queue<String> queue = new LinkedList<>();
queue.offer("0000");
while(!queue.isEmpty()){
int size = queue.size();
for(int i=0;i<size;i++){
String content = queue.poll();
for(int j=0;j<4;j++){
String plus = plusOne(content,j);
queue.offer(plus);
String minus =minusOne(content,j);
queue.offer(minus);
}
}
//记录步数
}
return -1;
}
2.处理当前是‘9’或‘0’的加减
public String plusOne(String str,int i){
char[] c = str.toCharArray();
if(c[i]=='9'){
c[i]='0';
}else{
c[i]+=1;
}
return new String(c);
}
public String minusOne(String str,int i){
char[] c =str.toCharArray();
if(c[i]=='0'){
c[i]='9';
}else{
c[i]-=1;
}
return new String(c);
}
3.记录已经遍历过的元素,保证不要重复选择 HashSet visite = new HashSet<>();
4.判断条件增加,遇到输入字符串和遍历到的字符串一样的时候,跳出当前循环,执行下一次循环
for(int i=0;i<size;i++){
String content = queue.poll();
if(dends.contains(content))continue;
......
5.判断条件增加,找到目标值跳出循环
for(int i=0;i<size;i++){
String content = queue.poll();
if(dends.contains(content))continue;
if(content.equals(tar))return step;
......