bfs 广度优先遍历的应用 --CountHomes

本文介绍了一种通过分析网格布局来计算居住区内独立住宅数量的方法。利用广度优先搜索算法,该方法能有效地区分并计数由相邻网格单元构成的独立住宅。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

为了进行城市规划,需要计算一个居住区的住宅数目。该居住聚集区俯视图已经制好,并规划为n x m个网格。如果网格单元具有屋顶定的一部分,则向其赋值1,如果是空地,则赋值0.由值为1的相邻网格单元组成的簇认定为一个单独建筑。对角放置的值为1的网格则不被视为同一住宅(屋顶)。

类Homes的方法countHomes的输入应包括一个n x m阶的二维整数数组grid,其中n和m分别表示输入数组grid的行数和列数。

该方法应该返回一个表示住宅总数目的整数,grid只包含0和1.

 测试用例1:

输入:

0,0,0,0,0

0,1,1,0,0

0,0,1,1,0

0,0,0,0,0

0,0,0,0,0,

输出:

1

测试用例2:

输入:

0,0,0,0

0,1,0,0

0,0,1,0

0,0,0,0

输出:

2

代码:

import java.util.ArrayDeque;
import java.util.Queue;

/**
 * @author Administrator
 *
 */
public class Homes {
	public static int counthHomes(int grid[][]) {
		// 特殊情况处理
		if (grid == null || grid[0].length == 0 || grid.length == 0) {
			return 0;
		}
		// 一般情况
		int rows = grid.length;
		int cols = grid[0].length;
		// 访问标志数组
		boolean visited[] = new boolean[rows * cols];
		int home_count = 0;
		for (int row = 0; row < rows; row++) {
			for (int col = 0; col < cols; col++) {
				if (count_home(grid, rows, cols, row, col, visited)) {
					home_count++;
				}
			}
		}
		return home_count;

	}

	private static boolean count_home(int[][] grid, int rows, int cols, int row, int col, boolean[] visited) {
		if (row >= 0 && row < rows && col >= 0 && col < cols && visited[row * cols + col] == false
				&& grid[row][col] == 1) {

			mark_neighbor_4(grid, rows, cols, row, col, visited);
			return true;
		}

		return false;
	}

	// 标记4连通区域,广度优先遍历
	// 使用队列辅助
	private static void mark_neighbor_4(int[][] grid, int rows, int cols, int row, int col, boolean[] visited) {
		if (row < 0 || row >= rows || col < 0 && col >= cols) {
			return;
		}
		Queue<Integer> indexQueue = new ArrayDeque<Integer>();
		indexQueue.offer(row);
		indexQueue.offer(col);
		int curRow;
		int curCol;
		while (!indexQueue.isEmpty()) {
			curRow = indexQueue.poll();
			curCol = indexQueue.poll();
			if (curRow - 1 >= 0 && curRow < rows && curCol >= 0 && curCol < cols && grid[curRow - 1][curCol] == 1
					&& visited[(curRow - 1) * cols + curCol] == false) {
				visited[(curRow - 1) * cols + curCol] = true;
				indexQueue.offer(curRow - 1);
				indexQueue.offer(curCol);
			}
			if (curCol - 1 >= 0 && curRow >= 0 && curRow < rows && curCol < cols && grid[curRow][curCol - 1] == 1
					&& visited[(curRow) * cols + curCol - 1] == false) {
				visited[(curRow) * cols + curCol - 1] = true;
				indexQueue.offer(curRow);
				indexQueue.offer(curCol - 1);

			}
			if (curRow + 1 < rows && curRow >= 0 && curCol >= 0 && curCol < cols && grid[curRow + 1][curCol] == 1
					&& visited[(curRow + 1) * cols + curCol] == false) {
				visited[(curRow + 1) * cols + curCol] = true;
				indexQueue.offer(curRow + 1);
				indexQueue.offer(curCol);

			}
			if (curCol + 1 < cols && curRow >= 0 && curRow < rows && grid[curRow][curCol + 1] == 1
					&& visited[(curRow) * cols + curCol + 1] == false) {
				visited[(curRow) * cols + curCol + 1] = true;
				indexQueue.offer(curRow);
				indexQueue.offer(curCol + 1);
			}

		}
		return;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		int grid1[][] = new int[4][4];

		System.out.println(grid1.length + "行" + grid1[0].length + "列");
		for (int i = 0; i < grid1.length; i++) {
			for (int j = 0; j < grid1[0].length; j++) {
				grid1[i][j] = 1;
			}
		}
		System.out.println(counthHomes(grid1));

		int grid2[][] = new int[4][4];
		System.out.println(grid2.length + "行" + grid2[0].length + "列");
		for (int i = 0; i < grid2.length; i++) {
			for (int j = 0; j < grid2[0].length; j++) {
				if (i == j) {
					grid2[i][j] = 1;
				}

			}
		}
		System.out.println(counthHomes(grid2));

		int grid3[][] = new int[5][5];
		System.out.println(grid3.length + "行" + grid3[0].length + "列");
		grid3[1][1] = 1;
		grid3[1][2] = 1;
		grid3[2][2] = 1;
		grid3[2][3] = 1;
		grid3[4][3] = 1;
		System.out.println(counthHomes(grid3));
	}

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值