洪水

洪水

题目描述

在一个nxm矩阵形状的城市里爆发了洪水,洪水从(0,0)的格子流到这个城市,在这个矩阵中有的格子有一些建筑,洪水只能在没有建筑的格子流动。请返回洪水流到(n - 1,m - 1)的最早时间(洪水只能从一个格子流到其相邻的格子且洪水单位时间能从一个格子流到相邻格子)。

给定一个矩阵map表示城市,其中map[i][j]表示坐标为(i,j)的格子,值为1代表该格子有建筑,0代表没有建筑。同时给定矩阵的大小nm(n和m均小于等于100),请返回流到(n - 1,m - 1)的最早时间。保证洪水一定能流到终点。


就是一个bfs

package com.jiading.niuke;

import java.util.ArrayDeque;

/**
 * @program: Algorithm
 * @description:
 * 在一个nxm矩阵形状的城市里爆发了洪水,洪水从(0,0)的格子流到这个城市,在这个矩阵中有的格子有一些建筑,洪水只能在没有建筑的格子流动。请返回洪水流到(n - 1,m - 1)的最早时间(洪水只能从一个格子流到其相邻的格子且洪水单位时间能从一个格子流到相邻格子)。
 *
 * 给定一个矩阵map表示城市,其中map[i][j]表示坐标为(i,j)的格子,值为1代表该格子有建筑,0代表没有建筑。同时给定矩阵的大小n和m(n和m均小于等于100),请返回流到(n - 1,m - 1)的最早时间。保证洪水一定能流到终点。
 * @author: JiaDing
 * @create: 2020-07-31 20:58
 **/
public class Problem1 {
    public int floodFill(int[][] map, int n, int m) {
        if(n==0&&m==0){
            return 0;
        }
        int distance=0;
        int x=0,y=0;
        int[][]visited=new int[n][m];
        ArrayDeque<Integer>xQueue=new ArrayDeque<>();
        ArrayDeque<Integer>yQueue=new ArrayDeque<>();
        xQueue.push(x);
        yQueue.push(y);
        visited[0][0]=1;
        int size=1;
        while(!xQueue.isEmpty()){
            x=xQueue.removeFirst();
            y=yQueue.removeFirst();
            if(x<n-1){
                if(y<m-1){
                    if(visited[x][y+1]==0&&map[x][y+1]==0){
                        xQueue.add(x);
                        yQueue.add(y+1);
                        visited[x][y+1]=1;
                    }
                    if(visited[x+1][y]==0&&map[x+1][y]==0){
                        xQueue.add(x+1);
                        yQueue.add(y);
                        visited[x+1][y]=1;
                    }
                }else{
                    //只能向下
                    if(visited[x+1][y]==0&&map[x+1][y]==0){
                        xQueue.add(x+1);
                        yQueue.add(y);
                        visited[x+1][y]=1;
                    }
                }
            }else{
                if(y<m-1){
                    //只能向右
                    if(visited[x][y+1]==0&&map[x][y+1]==0){
                        xQueue.add(x);
                        yQueue.add(y+1);
                        visited[x][y+1]=1;
                    }
                }else{
                    return distance;
                }
            }
            size--;
            if(size==0){
                distance++;
                size=xQueue.size();
            }
        }
        return -1;
    }
}
posted @ 2020-07-31 21:25  别再闹了  阅读(76)  评论(0)    收藏  举报