首页 > 其他分享 >蓝桥杯(全球变暖dfs)

蓝桥杯(全球变暖dfs)

时间:2023-04-04 21:13:58浏览次数:38  
标签:数组 int dfs 蓝桥 大陆 static sea 变暖

蓝桥杯(全球变暖dfs)

import java.util.Scanner;

/**
 * 该题使用了深度优先算法dfs用于把相连的#号当成一块大陆,并通过数组记录下有几块大陆
 * dfs算法并不难,只要对用dfs处理过后留下的aes数组和sea数组进行处理得到结果即可
 * 我的思路就是
 * 1、sea数组记录源数据,然后判断是否被淹赋‘*’号记录
 * 2、aes数组使用dfs算法把第一块大陆标记为1,第二块标记为2,以此类推
 * 3、最后假设num块大陆全部被淹,遍历sea数组如果有‘#’号则判断是第几块大陆,没有重复就使num减一
 * 4、最后输出num为最终结果
 */

public class test1 {
    static char[][] sea;//用于记录用例
    static int[][] aes;//用于记录不同的大陆,其值为不同大陆的标记
    static int n;//输入的初值
    static int num=0;//最后被淹没的大陆数量
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        n = scan.nextInt();
        sea = new char[n][n];
        aes = new int[n][n];
        //初始化sea
        for(int i=0;i<n;i++){
            sea[i] = scan.next().toCharArray();
        }
        //给aes初值全部赋0
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
              aes[i][j]=0;

        for(int i=0;i<n;i++){
            for (int j=0;j<n;j++){
                if(sea[i][j]=='#'){
                    if(aes[i][j]==0) {
                        num++;
                        dfs(i, j);//当检测到陆地就使用dfs()方法赋值
                    }
                    if(submerge(i,j))
                        sea[i][j]='*';//使用sunmerge方法判断是否会被淹没,被淹没就赋‘*’
                }
            }
        }
        //目前已知有num块陆地,使用数组land[]记录下还未被淹的陆地
        int[] land = new int[num];
        for(int i=0;i<num;i++)
            land[i]=1;
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++){
                if(sea[i][j]=='#'){//当有被还未被淹没的陆地时
                    int x=aes[i][j]-1;
                    if(land[x]!=0){//此陆地还未被记录就把land赋0,淹没的陆地数num-1
                        land[x]=0;
                        num--;
                    }
                }
            }
        System.out.println(num);
    }

    static int[] x = {0,1,0,-1};
    static int[] y = {1,0,-1,0};
    //判断是否会被淹没,淹没返回true,否则返回false
    public static boolean submerge(int a, int b){
        for(int i=0;i<4;i++){
            if(a+y[i]>=0 && a+y[i]<n && b+x[i]>=0 && b+x[i]<n && sea[a+y[i]][b+x[i]]=='.')
                return true;
        }
        return false;
    }
    //DFS深度优先,把所在的大陆通过dfs都标记上记号num如:
    /*
    sea[][]: ....   aes[][]:0000
             .##.           0110
             ....           0000
     */
    public static void dfs(int a,int b){
        aes[a][b]=num;
        for(int i=0;i<4;i++){
            if(a+y[i]>=0 && a+y[i]<n && b+x[i]>=0 && b+x[i]<n && sea[a+y[i]][b+x[i]]=='#'&&aes[a+y[i]][b+x[i]]==0)
                dfs(a+y[i],b+x[i]);
        }
    }
}

标签:数组,int,dfs,蓝桥,大陆,static,sea,变暖
From: https://www.cnblogs.com/KJplant/p/17287901.html

相关文章

  • hdfs集群的扩容和缩容
    目录1、背景2、集群黑白名单3、准备一台新的机器并配置好hadoop环境3.1我们现有的集群规划3.2准备一台新的机器3.2.1查看新机器的ip3.2.2修改主机名和host映射3.2.3配置时间同步3.2.4关闭防火墙3.2.5新建hadoop部署用户3.2.6复制hadoop04机器上的/etc/hosts文件到集群的另......
  • 2023蓝桥杯省赛C/C++组备赛
    一、简单计算与模拟1.成绩统计#include<bits/stdc++.h>usingnamespacestd;intn;intmain(){ doublepoint; doublejige=0,youxiu=0; cin>>n; for(inti=0;i<n;++i){ cin>>point; if(point>=60){ jige++; if(point&......
  • (4.3)数组、对象及类数组对象,set的用法,正则表达式的常用方法,蓝桥杯备赛-(生成数组、数
    1.1数组、对象及类数组对象1.数组:​ 数组是有序的数据集合,其中的索引值从0开始递增,并且数组有length属性,可以获取数组内的元素个数,其中的值可以是任何的数组类型。2.对象:​ 对象是无序的是由一个或多个键值对组成的数据集合,对象没有length属性。3.伪数组(类数组对象):​ ......
  • POJ 2773 Happy 2006 二分+容斥原理(二进制枚举或dfs)
    Happy2006TimeLimit: 3000MS MemoryLimit: 65536KTotalSubmissions: 14003 Accepted: 4946DescriptionTwopositiveintegersaresaidtoberelativelyprimetoeachotheriftheGreatCommonDivisor(GCD)is1.Forinstance,1,3,5,7,9...areallrelativel......
  • 【FastDFS分布式文件系统】5.FastDFS客户端的配置、启动和常用命令
    上一篇我们介绍了FastDFS服务端的tracker追踪服务器和storage存储服务器,本篇来介绍一下客户端的启动,以及外部客户端如何与FastDFS服务端进行连接。和之前一样,服务端部署在三台服务器上:其中192.168.195.129是tracker追踪服务器,192.168.195.130和192.168.195.131......
  • 【FastDFS分布式文件系统】6.FastDFS客户端启动与Java连接
    上一篇我们讲解了如何配置和启动FastDFS客户端,以及客户端上传下载的一些常用命令。那么,在许多需要进行分布式文件上传与下载的系统中,就不能像执行Linux命令一样去上传和下载文件,它们需要使用开发系统的语言去操作客户端使用其命令与服务端进行交互,此时FastDFS......
  • [2022年蓝桥杯C/C++ A组]个人做题记录
    碎碎念欸嘿,鸽了小半年去做了一些不喜欢的事情,但兜兜转转,还是acm最香捏求和题意求\(\sum_{i=1}^n\sum_{j=1}^na_i*a_j(i!=j)\)题解感觉是去年的时候笨人唯一做满分的题……经典前缀和,设\(sum[i]=\sum_{j=i}^na[j]\),答案即为\(\sum_{i=1}^{n-1}a[i]*sum[i+1]\)#definein......
  • [每天例题]蓝桥杯 C语言 单词分析
    蓝桥杯C语言单词分析题目  题目要求1.寻找出现最多的字母和这个字母出现的次数。2.如果有多个字母出现的次数相等,输出字典序最小的那个。思路分析输入方法:方法一:1.可以通过数组来记录该单词,并为单词出现的每一个字母做上标记。2.可以采用for循环将字符串依次输......
  • 2018年第九届蓝桥杯—B组C/C++程序设计省赛解题-2明码
    .明码汉字的字形存在于字库中,即便在今天,16点阵的字库也仍然使用广泛。16点阵的字库把每个汉字看成是16x16个像素信息。并把这些信息记录在字节中。一个字节可以存储8位信息,用32个字节就可以存一个汉字的字形了。把每个字节转为2进制表示,1表示墨迹,0表示底色。每行2个字节,一共16......
  • 洛谷 P8742 [蓝桥杯 2021 省 AB] 砝码称重
    经典01背包题首先介绍一下01背包,即一种DP问题,以放置物品为模型,每个物品只能放一次。其区分于完全背包(每个物品可以放无限多次),以及多重背包(每个物品有一个固定次数上限)。题中给出了$N$个砝码及每个砝码的质量,要求我们求出可以称出质量的种数。由此想到转化为01背包。......