【发布时间】:2021-07-21 10:46:09
【问题描述】:
我的问题是,对于我的 pacman 板创建,我使用一维数组,但我想对幽灵实现 BFS 算法,据我了解,除非我有一个带有节点和边的图,否则我无法执行该算法。 ..所以在我的代码中,我试图将新创建的二维数组转换为哈希映射,并为键(节点)使用迭代器,并且该节点包含“值”,它是板上的特定索引。我希望我走在正确的轨道上,但我正在为此苦苦挣扎。
package pacman;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.stream.Collectors;
import org.jgrapht.Graph;
import org.jgrapht.graph.DefaultEdge;
import org.jgrapht.graph.DefaultUndirectedGraph;
import org.jgrapht.graph.SimpleWeightedGraph;
/**
* This class is used to create a graph from a 2d array
*
* @author Kody Berry
*
*/
public class GraphCreation {
private final static short levelData[] = { 19, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 22, 17, 16, 16, 16, 16,
24, 16, 16, 16, 16, 16, 16, 16, 16, 20, 25, 24, 24, 24, 28, 0, 17, 16, 16, 16, 16, 16, 16, 16, 20, 0, 0, 0,
0, 0, 0, 17, 16, 16, 16, 16, 16, 16, 16, 20, 19, 18, 18, 18, 18, 18, 16, 16, 16, 16, 24, 24, 24, 24, 20, 17,
16, 16, 16, 16, 16, 16, 16, 16, 20, 0, 0, 0, 0, 21, 17, 16, 16, 16, 16, 16, 16, 16, 16, 20, 0, 0, 0, 0, 21,
17, 16, 16, 16, 24, 16, 16, 16, 16, 20, 0, 0, 0, 0, 21, 17, 16, 16, 20, 0, 17, 16, 16, 16, 16, 18, 18, 18,
18, 20, 17, 24, 24, 28, 0, 25, 24, 24, 16, 16, 16, 16, 16, 16, 20, 21, 0, 0, 0, 0, 0, 0, 0, 17, 16, 16, 16,
16, 16, 20, 17, 18, 18, 22, 0, 19, 18, 18, 16, 16, 16, 16, 16, 16, 20, 17, 16, 16, 20, 0, 17, 16, 16, 16,
16, 16, 16, 16, 16, 20, 17, 16, 16, 20, 0, 17, 16, 16, 16, 16, 16, 16, 16, 16, 20, 25, 24, 24, 24, 26, 24,
24, 24, 24, 24, 24, 24, 24, 24, 28 };
public static Graph<Integer, DefaultEdge> undirectedGraph = new DefaultUndirectedGraph<Integer, DefaultEdge>(
DefaultEdge.class);
public static Graph<Integer, DefaultEdge> createGraph(int[][] s) {
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
int k = 1;
// Getting an iterator
Iterator<?> mapIterator = map.entrySet().iterator();
// Adding values to hash map
for (int i = 0; i < s.length; i++) {
for (int j = 0; j < s[i].length; j++) {
if (s[i][j] == 16) {
map.put(k, s[i][j]);
k++;
}
}
}
while (mapIterator.hasNext()) {
Map.Entry mapElement = (Map.Entry)mapIterator.next();
int t = (int) mapElement.getKey();
undirectedGraph.addVertex(t);
}
return undirectedGraph;
}
/**
* Method used to convert the 1d array game board to a 2d array board
*
* @param s
* @return
*/
public static int[][] oneDtoTwoDConverter(short[] s) {
int array2d[][] = new int[15][15];
for(int i=0; i<15;i++)
for(int j=0;j<15;j++)
array2d[i][j] = s[(j*15) + i];
return array2d;// Returns new 2d array.
}
// Test output
public static void main(String[] args) {
int[][] s = oneDtoTwoDConverter(levelData);
System.out.println(createGraph(s));
}
}
我目前的输出如下。
([], [])
我也在使用 JGraphT 库。我还没有弄清楚如何创建边缘,所以如果您对此有任何建议,我将不胜感激。
PS。如果您对如何执行此操作有更好的想法,请告诉我!谢谢你:)
【问题讨论】:
标签: java arrays graph hashmap breadth-first-search