//初始化存储边的数组 edges = new ArrayList[idWord.size()]; for(int i = 0; i < idWord.size(); i++){ edges[i] = new ArrayList<>(); } //添加边 for(int i = 0; i < idWord.size(); i++){ for(int j = i + 1; j < idWord.size(); j++){ //如果两者可以通过转换得到 则在它们间建一条无向边 if(transformCheck(idWord.get(i), idWord.get(j))){ edges[i].add(j); edges[j].add(i); } } }
int dest = wordId.get(endWord); //目的 id List<List<String>> res = new ArrayList<>();//存答案 int[] cost = newint[id];//到每个点的代价 for(int i = 0; i < id; i++){ cost[i] = INF; }
//将起点加入队列,并将其cost 设置为 0 Queue<ArrayList<Integer>> q = new LinkedList<>(); ArrayList<Integer> tmpBegin = new ArrayList<>(); tmpBegin.add(wordId.get(beginWord)); q.add(tmpBegin); cost[wordId.get(beginWord)] = 0;
//广度优先搜索 while(! q.isEmpty()){ ArrayList<Integer> now = q.poll(); int last = now.get(now.size() - 1);//最近访问的点 if(last == dest){//若该点为终点则将其存入答案 res 中 ArrayList<String> tmp = new ArrayList<>(); for(int index : now){ tmp.add(idWord.get(index)); } res.add(tmp); }else{//该点不为终点 继续搜索 for(int i = 0; i < edges[last].size(); i++){ int to = edges[last].get(i); //此处 <= 目的在于把代价相同的不同路径全部保存下来 if(cost[last] + 1 <= cost[to]){ cost[to] = cost[last] + 1; //把 to 加入路径中 ArrayList<Integer> tmp = new ArrayList<>(now); tmp.add(to); q.add(tmp); } }