首页 > 其他分享 >十四 687. 扫雷 (Flood Fill)

十四 687. 扫雷 (Flood Fill)

时间:2024-03-26 15:25:17浏览次数:14  
标签:int res ++ private Flood static && 687 Fill

687. 扫雷 (Flood Fill)
image

思路:首先处理读取的网格str数组为g数组,若为地雷,则对应位置为-1,否则对应位置为以当前位置作为中心九宫格内地雷数量。然后遍历新数组g,若为0,则点击次数加一,再使用DFS处理当前位置即周围九宫格,若也为0继续DFS,所有搜索过的位置都标记为-1,最后再遍历一遍数组g,此时数组中应没有0,凡是不为-1的点击次数都加一。

import java.util.*;

public class Main {
    private static int T;
    private static int n;
    private static char[][] str;
    private static int[][] g;
    
    private static void dfs(int a, int b) {
        int t = g[a][b];
        g[a][b] = -1;
        if (t != 0) {
            return;
        }
        
        for (int x = a - 1; x <= a + 1; x++) {
            for (int y = b - 1; y <= b + 1; y++) {
                if (x >= 0 && x < n && y >= 0 && y < n && g[x][y] != -1) {
                    dfs(x, y);
                }
            }
        }
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        T = sc.nextInt();
        
        for (int cases = 1; cases <= T; cases++) {
            n = sc.nextInt();
            str = new char[n][n];
            g = new int[n][n];
            sc.nextLine();
            for (int i = 0; i < n; i++) {
                String line = sc.nextLine();
                str[i] = line.toCharArray();
            }
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    if (str[i][j] == '*') {
                        g[i][j] = -1;
                    }
                    else {
                        g[i][j] = 0;
                        for (int x = i - 1; x <= i + 1; x++) {
                            for (int y = j - 1; y <= j + 1; y++) {
                                if (x >= 0 && x < n && y >= 0 && y < n && str[x][y] == '*') {
                                    g[i][j]++;
                                }
                            }
                        }
                    }
                }
            }
            
            int res = 0;
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    if (g[i][j] == 0) {
                        res++;
                        dfs(i, j);
                    }
                }
            }
            
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    if (g[i][j] != -1) {
                        res++;
                    }
                }
            }
            
            System.out.println("Case #" + cases + ": " + res);
        }
    }
}

标签:int,res,++,private,Flood,static,&&,687,Fill
From: https://www.cnblogs.com/he0707/p/18096717/lanqiaobei14

相关文章

  • 蓝桥杯算法集训 - Week 4:BFS、并查集、Flood Fill、哈希、单调栈/队列
    蓝桥杯算法集训-Week4本系列随笔用于整理AcWing题单——《蓝桥杯集训·每日一题2024》的系列题型及其对应的算法模板。一、BFSBFS算法复习参考:BFS(Java)广度优先搜索简单介绍、模板、案例(一)Ⅰ、代码模板staticvoidbfs(Troot){//双端队列,用来存储元素D......
  • P8687 [蓝桥杯 2019 省 A] 糖果
    题意:n个零食,每个零食有k种配料,一共有m种配料。问最少吃几包零食,可以吃到所有配料。n<=100,m<=20,k<=m。思路:最优化问题,如果n<=20可以直接bf,这里m<=20,对m进行状态压缩,正确的解法应该是线性dp+状态压缩。总结:很容易陷入一个哈密顿路径思路的误区中,在哈密顿路径中,一......
  • av_image_fill_arrays
    av_image_fill_arrays是FFmpeg中用于填充图像数据指针数组的函数之一。在音视频处理领域,正确使用av_image_fill_arrays函数可以帮助我们有效地处理图像数据。av_image_fill_arrays函数原型/***Setupthedatapointersandlinesizesbasedonthespecifiedimage*parame......
  • av_samples_fill_arrays
    av_samples_fill_arrays是FFmpeg中一个非常重要的函数,用于填充音频数据的指针数组。在音视频处理中,经常需要处理音频数据,而av_samples_fill_arrays可以正确地组织音频数据,以便后续处理和编解码。av_samples_fill_arrays函数的原型:/***Fillplanedatapointersandlinesize......
  • 「杂题乱刷」P8687
    题目链接最典的状压dp了。直接枚举每个状态然后用01背包的方式做即可。时间复杂度\(O(n2^m)\)。代码:点击查看代码/*Tips:你数组开小了吗?你MLE了吗?你觉得是贪心,是不是该想想dp?一个小时没调出来,是不是该考虑换题?*/#include<bits/stdc++.h>usingnamespacestd;......
  • CF1687D Cute number 题解
    题目链接点击打开链接题目解法一个数\(c\)是可爱(下文称为合法)的,当且仅当\(c\in[x^2,x(x+1)]\)令\(a_i\)属于\([x_i,x_i(x_i+1)]\)一个显然的范围是\(x_1\le2\times10^6\)考虑枚举\(x_1\)现在说明一个结论:\(x_1\)固定时,\(x_i\)也固定了说明:不难发现,合法的不合......
  • 洛谷 P8687 [蓝桥杯 2019 省 A] 糖果
    题意有\(m\)种口味,每次\(k\)颗一袋出售,给你\(n\)包均为\(k\)颗的糖果,求最少买几袋可以吃到所有口味的糖果。思路暴力对\(n\)包糖果做组合。如果找到其中一种包含了所有口味,将所有满足的方案取糖果包数最小即可。时间复杂度\(\mathcal{O(2^n)}\)。正解考虑状......
  • C++中setw和setfill函数的结合应用
    一、头文件头文件为#include<iomanip>其中io代表输入输出,manip是manipulator(操纵器)的缩写iomanip的作用:主要是对cin,cout之类的一些操纵运算子,比如setfill,setw,setbase,setprecision等等。它是I/O流控制头文件,就像C里面的格式化输出一样。二、setw函数s......
  • mybatisPlus注解fill = FieldFill.UPDATE和updateStrategy = FieldStrategy.IGNORED的
    由于当时使用mybatisPlus的updateById更新数据,习惯性的认为字段为null的不更新。但是上线后,出问题了。只更新状态字段,其他的一些属性竟然被置空了。赶紧排查,发现实体类中这些字段有fill=FieldFill.UPDATE,导致更新的时候如果这个字段为null也会更新为null。 同样作用的还有@T......
  • Flood Fill
    好习惯:先看样例,直接手模。手摸完第一个样例我们会发现:当两个值不一样的连通块相邻时,我们若翻转其中一个,再翻转另外一个的时候,与直接翻转另外一个没有区别。举个例子:010我们先翻转1,变成了000,此时我们再翻转000则变成了111。与直接翻转010两边的0变成111没有任何区......