この関数は、マトリックス配列をリング半径としてスプライスします。
public static int[][] SpliceMatrix(int orginX, int orginY, int ringRadius, int[][] map){
int[][] tempMap = new int[ringRadius * 2 + 1][ringRadius * 2 + 1];
int tempY = -ringRadius;
for(int i = 0; i < (ringRadius * 2 + 1); i++){
int tempX = -ringRadius;
for(int j = 0; j < (ringRadius * 2 + 1); j++){
try{
tempMap[i][j] = map[orginY + tempY][orginX + tempX];
}catch(ArrayIndexOutOfBoundsException e){
tempMap[i][j] = 1;
}
tempX++;
}
tempY++;
}
return tempMap;
}
この関数で A* アルゴリズムを使用しました。
private static Point findNext2(int orginX, int orginY, int[][] map){
//Find "2"s
ArrayList<Point> ends = new ArrayList<Point>();
for(int i = 0; i < map.length; i++){
for(int j = 0; j < map[0].length; j++){
if(map[i][j] == 2){
ends.add(new Point(j, i));
map[i][j] = 0;//Clear for A*
}
}
}
//Find the closest
if(ends.size() > 0){
Point p = null;
int distance = 100;
for(int i = 0; i < ends.size(); i++){
int tempDistance = APlus.go(orginX, orginY, ends.get(i).x, ends.get(i).y, map).size();
System.out.println(tempDistance);
if(tempDistance != 0 && tempDistance < distance){
distance = tempDistance;
p = new Point(ends.get(i).x, ends.get(i).y);
}
}
if(p == null){
System.out.println("2 is not accesible");
return null;
}
return p;
}else{
System.out.println("There is no 2 in ring");
return null;
}
}
それから私は使用します
public static void main(String args[]){
int[][] m_array = new int[6][6];
m_array[0] = new int[]{1, 1, 0, 0, 2, 0};
m_array[1] = new int[]{0, 0, 0, 0, 0, 1};
m_array[2] = new int[]{1, 1, 1, 0, 1, 0};
m_array[3] = new int[]{1, 0, 1, 0, 1, 0};
m_array[4] = new int[]{0, 0, 0, 0, 1, 0};
m_array[5] = new int[]{0, 0, 0, 0, 0, 0};
int[][] c = SpliceMatrix(2, 2, 2, m_array);//int x, int y, ringRadius, matrix
Point p = findNext2(3, 3, c);//orginX, orginY, matrix
System.out.println(p + " is the closest 2");
}
それが説明的だったことを願っています。HTML をまだ正しく使用できません。