算法题解:求岛的最大面积问题(JAVA+DFS算法)

求岛的最大面积问题(JAVA+DFS算法)

问题描述

问题描述:给定一个二维矩阵,用0表示水域,1-9表示陆地,现给定一个岛屿上的坐标点,求解所在岛屿的面积。

假设条件为:二维矩阵 M<=50;N<=50;给定的坐标点的值不为0值(即为岛屿)

样例数据如下:

第一行输入两个整数,表示矩阵的N行和M列的值;

之后,输入N行数据,每行M个整数值,来构造N行M列的矩阵;

之后,再输入两个整数,表示岛上的坐标点,求这个坐标点所在的岛屿的面积。


10 10 
1 2 1 0 0 0 0 0 2 3 
3 0 2 0 1 2 1 0 1 2 
4 0 1 0 1 2 3 2 0 1 
3 2 0 0 0 1 2 4 0 0 
0 0 0 0 0 0 1 5 3 0 
0 1 2 1 0 1 5 4 3 0 
0 1 2 3 1 3 6 2 1 0 
0 0 3 4 8 9 7 5 0 0 
0 0 0 3 7 8 6 0 1 2 
0 0 0 0 0 0 0 0 1 0 
6 8

输出结果为:

38
 


算法实现

package com.bean.algorithm.dfsbfs;

import java.util.Scanner;

/*
 * 测试数据
 * 输入数据
 * 1 2 1 0 0 0 0 0 2 3 
 * 3 0 2 0 1 2 1 0 1 2 
 * 4 0 1 0 1 2 3 2 0 1 
 * 3 2 0 0 0 1 2 4 0 0 
 * 0 0 0 0 0 0 1 5 3 0 
 * 0 1 2 1 0 1 5 4 3 0 
 * 0 1 2 3 1 3 6 2 1 0 
 * 0 0 3 4 8 9 7 5 0 0 
 * 0 0 0 3 7 8 6 0 1 2 
 * 0 0 0 0 0 0 0 0 1 0 
 * 6 8
 * 输出数据
 * 38
 * */
public class MaxAreaofIsland22 {
	
	//定义一个不超过50行50列的数组nums
	static int[][] nums = new int[50][50];
	//定义一个不超过50行50列的辅助数组aux
    static int[][] aux = new int[50][50];
    /*
     * area用来表示岛屿的面积
     * 初始值为1,因为输入的坐标点表示陆地。如果其四周都为水域,即值为0时,其面积为1.
     * */
    static int area = 1;
    static int n, m;
    static Scanner input = new Scanner(System.in);

    public static void main(String[] args) {
    	//接收输入值,确定矩阵是N行和M列的矩阵
        n = input.nextInt();
        m = input.nextInt();
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
            	//为N行M列的矩阵元素赋值
            	nums[i][j] = input.nextInt();
            }
        }
        //输入岛的坐标
        int startX = input.nextInt();
        int startY = input.nextInt();
        //根据输入坐标的位置,标记aux[startX][startY]的值为1,即陆地
        aux[startX][startY] = 1;
        //从startX,startY的位置开始,调用dfs搜索算法
        dfs(startX, startY);
        //输出计算结果,获得岛屿的面积
        System.out.println(area);
    }
    
    /*
     * DFS搜索算法
     * 输入参数:搜索位置的X,Y坐标
     * 计算逻辑:
     * 从X,Y位置开始,向4个方向进行搜索,定义一个方向数组
     * */
    public static void dfs(int x, int y) {
        int[][] next = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
        int tx, ty;
        for (int i = 0; i < 4; i++) {
            tx = x + next[i][0];
            ty = y + next[i][1];
            if(tx < 0 || tx > n - 1 || ty < 0 || ty > n - 1) {
                continue;
            }
            if (nums[tx][ty] > 0 && aux[tx][ty] == 0) {
            	area ++;
            	aux[tx][ty] = 1;
                dfs(tx, ty);
            }
        }
        return;
    }

}

程序运行结果:

[输入信息]

[输出结果]

38

你可能感兴趣的:(算法分析与设计)