BFS演算法清除矩陣上大於1的點
阿新 • • 發佈:2018-11-03
一塊足夠大的地方散佈著許多石頭,為了方便活動,必須把這些石頭挪開。假設整個場地是一塊矩形的地圖,地圖座標的橫縱座標均為非負整數。以連結串列形式表示的場地中各個座標點的情況。
0:代表無法從這個點通過
1:代表這個點可以順利通過
N(大於1):代表這個點上有一個可以去除的石頭,而且石頭的大小是N
如果(0,0)上有石頭可以直接移除,每移除一個石頭,該石頭所在座標就可以通行即值變為1
。
你需要編寫一個程式計算出從座標(0,0)
出發,按照石頭大小,從小到大依次移除場地中的石頭,返回最小的步數,如果無法移除所有的石頭就返回-1
。
import java.awt.Point; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; import java.util.List; import java.util.Queue; import java.util.stream.Collectors; public class TeamBuilding { public int getMinimumSteps (List<List<Integer>> stones){ int dx, dy, gx = 0, gy = 0; int[][] deep; int M = stones.size(); int N = stones.get(0).size(); dx=0; dy=0; deep = new int[M][N]; int [][]a = new int [M][N]; for (int i = 0; i < stones.size(); i++){ for (int j = 0; j < stones.get(0).size(); j++) { a[i][j]= stones.get(i).get(j); } } Boolean ite = true; int sum = 0; while (ite) { int min=1000000; for (int i = 0; i < stones.size(); i++){ for (int j = 0; j < stones.get(0).size(); j++) { if(a[i][j]<min & a[i][j]>1){ min = a[i][j]; gx = i; gy = j; } } } if(min==1000000){ ite = false; break; } Queue<Point> q = new LinkedList<Point>(); int[] tx = { -1, 1, 0, 0 }; int[] ty = { 0, 0, 1, -1 }; q.offer(new Point(dx, dy)); for (int i = 0; i < M; i++) for (int j = 0; j < N; j++) deep[i][j] = -1; deep[dx][dy] = 0; a[gx][gy]=1; while (q.size() > 0) { Point p = q.poll(); if (p.x == gx && p.y == gy) break; for (int i = 0; i < 4; i++) { int x = p.x + tx[i]; int y = p.y + ty[i]; //p為當前位置; if (x >= 0 && x < M && y >= 0 && y < N && a[x][y] >= 1 && deep[x][y] == -1) { deep[x][y] = deep[p.x][p.y] + 1; q.offer(new Point(x, y)); } } } dx = gx; dy = gy; int len = deep[gx][gy]; if (len==-1){ return -1; } sum = sum+len; } return sum; } }