(補足)20200911:204ウィークリーコンペティションの問題を解決する

Likou204毎週の競争問題が解決しました

トピック

3.1568。土地を分離するための最小日数
ここに画像の説明を挿入

アイデアとアルゴリズム

  1. 今週のコンテストの3番目の質問はほとんど見えず、4番目の質問は私の現在のレベルを超えているのでスキップしてください。3番目の質問は典型的なdfsまたはbfsの質問で、島をつなぐ、または島を分割するのと同じタイプの質問です。答えが0、1、または2しかないことに気付いたら、基本的には終わりです。書くことに注意してください。コードを見る

コード


class Solution {
    
    
	int m, n;
	boolean[][] used;
	// 表示上下左右
	private static final int[][] directions = {
    
     {
    
     0, 1 }, {
    
     0, -1 }, {
    
     -1, 0 }, {
    
     1, 0 } };

	public int minDays(int[][] grid) {
    
    
		m = grid.length;
		n = grid[0].length;
		used = new boolean[m][n];
		if (numOfLand(grid)) {
    
    
			return 0;
		} else {
    
    
			// 枚举 去掉其中一个1看能不能满足
			for (int i = 0; i < m; i++) {
    
    
				for (int j = 0; j < n; j++) {
    
    
					if (grid[i][j] == 1) {
    
    
						grid[i][j] = 0;
						if (numOfLand(grid)) {
    
    
							return 1;
						}
						grid[i][j] = 1;
					}
				}
			}
			return 2;
		}
	}

	public boolean numOfLand(int[][] grid) {
    
    
		// 计算是否有多个连通块,或者0个连通块
		int count = 0;
		used = new boolean[m][n];
		for (int i = 0; i < m; i++) {
    
    
			for (int j = 0; j < n; j++) {
    
    
				if (!used[i][j] && grid[i][j] == 1) {
    
    
					count++;
					dfs(grid, i, j);
				}
			}
		}
		return count > 1 || count == 0;
	}

	public void dfs(int[][] grid, int i, int j) {
    
    
		used[i][j] = true;
		for (int k = 0; k < 4; k++) {
    
    
			int x = i + directions[k][0];
			int y = j + directions[k][1];
			if (inside(x, y) && !used[x][y] && grid[i][j] == 1) {
    
    
				dfs(grid, x, y);
			}
		}
	}

	public boolean inside(int x, int y) {
    
    
		return x >= 0 && x < m && y >= 0 && y < n;
	}
}

最後に書く

ラッシュ!

おすすめ

転載: blog.csdn.net/qq_36828395/article/details/108558116