最小步数模型
这题的算法思想就是将每一串字符都想象成一个点,已知起点和终点,每一次更新相邻的节点,采用bfs得到到达终点的最短路径,然后这里使用map来存储对应字符串和对应的遍历顺序
import java.io.*;
import java.util.*;
class Main {
static void swap(char[] a, int i, int j) {
char tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
static int bfs(String start, String end) {
Map<String, Integer> map = new HashMap<>();
Queue<String> q = new LinkedList<>();
q.offer(start);
map.put(start, 0);
int[] dx = {-1, 0, 1, 0}, dy = {0, 1, 0, -1};
while (!q.isEmpty()) {
String s = q.poll();
if (s.equals(end)) return map.get(s);
// 获得x的位置
int k = s.indexOf('x');
int x = k / 3, y = k % 3;
for (int i = 0; i < 4; i++) {
int a = x + dx[i], b = y + dy[i];
if (a < 3 && a >= 0 && b < 3 && b >= 0) {
// 对字符串中的字符进行更改
char[] arr = s.toCharArray();
swap(arr, k, a * 3 + b);
String str = new String(arr);
// 如果没有被遍历过
if (map.get(str) == null) {
map.put(str, map.get(s) + 1);
q.offer(str);
}
}
}
}
return -1;
}
public static void main(String[] args) throws IOException {
BufferedReader cin = new BufferedReader(new InputStreamReader(System.in));
String[] s = cin.readLine().split(" ");
String start = "";
for (int i = 0; i < s.length; i++) start += s[i];
String end = "12345678x";
System.out.println(bfs(start, end));
}
}
为啥不能写成
为啥这么写会爆数组越界啊
这位大哥能否帮我看看哪里出错了呜呜呜,感激涕零
、、、
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import java.util.Scanner;
/*
* @author 文思涌
* 845.八数码
* 2020年12月17日
/
public class Main {
private static String start=”“;
private static String end=”12345678x”;
public static int bfs() {
Queue[HTML_REMOVED] queue=new LinkedList[HTML_REMOVED]();
Map[HTML_REMOVED] dist=new HashMap<>();//记录实现到满足这字符串的最短距离
dist.put(start, 0);//初始化为0
queue.offer(start);
*/
return new String(c);//用这种就可以转变成String数组
}
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
for(int i=0;i<9;i++) {
String str=scanner.next();
start+=str;
}
//System.out.println(start.indexOf(‘x’));
System.out.println(bfs());
}
}
、、、
出现的主要问题的地方是
应该修改为
另外注意中英文的引号
原来如此,谢谢大佬