1. 程式人生 > >BFS演算法清除矩陣上大於1的點

BFS演算法清除矩陣上大於1的點

一塊足夠大的地方散佈著許多石頭,為了方便活動,必須把這些石頭挪開。假設整個場地是一塊矩形的地圖,地圖座標的橫縱座標均為非負整數。以連結串列形式表示的場地中各個座標點的情況。

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;
    }
}