百度真题之城市规划(连通域数目)

题目:

给出一个二维矩阵,矩阵元素为1或0,计算由1构成的独立不连通的区域数目,斜角为1也算连通。如以下矩阵:

0 1 0 0 0 0

0 1 0 1 0 0

0 0 0 0 1 1

连通域的个数为2.

分析:

建立一个集合list保存已经标记的坐标,循环遍历每一个点,当该点的值为1并且未被标记的话,将该点标记,并标记与该点相邻的点(使用递归,可以标记与该点连通的所有点)。

以下代码:

package project001;
import java.util.ArrayList;
import java.util.List;

public class Main09 {
//找到矩阵中1的非连通区域的个数,斜对角也算连通
    public static List<int[]> markedList = new ArrayList<int[]>();
    public static void main(String[] args) {

        int[][] maze = {{0,0,0,0,0},
                        {0,1,0,0,0},
                        {0,0,0,1,0},
                        {1,1,0,0,0},
                        {0,0,0,1,1}};
        double t = System.currentTimeMillis();
        System.out.println(getL(fillM(maze)));

    }
    public static int getL(int[][] M){
        int count = 0;
        int row = M.length;
        int col = M[0].length;
        for(int i = 0;i<row;i++){
            for(int j=0;j<col;j++){
                //当该点为被标记,并且为1时,标记所有与该点连通的点
                if(M[i][j]==1 && !isMarked(i,j)){
                    markPoint(i,j,M);
                    count++;
                }
            }
        }
        return count;
    }

    public static int[][] fillM(int[][] M){
        int row = M.length;
        int col = M[0].length;
        int[][] M2 = new int[row+2][col+2];
        for(int i = 1;i<=row;i++){
            for(int j=1;j<=col;j++){
                M2[i][j]=M[i-1][j-1];
            }
        }
        return M2;
    }

    //判断该点是否被标记
    public static boolean isMarked(int i,int j){
        int size = markedList.size();
        if(size<=0) return false;
        for(int k=0;k<size;k++){
            int[] m = markedList.get(k);
            if(m[0]==i&&m[1]==j) return true;
        }
        return false;
    }
    //标记点(i,j)并且标记所有与该点连通的区域
    public static void markPoint(int i,int j,int[][] M){
        if(isMarked(i,j)) return ;

        //将该点标记,即放入一个list内
        int[] m = new int[]{i,j};
        markedList.add(m);

        //标记与点(i,j)相邻并且未被标记的点
        if(!isMarked(i-1,j-1)&&M[i-1][j-1]==1) markPoint(i-1,j-1,M);
        if(!isMarked(i-1,j)&&M[i-1][j]==1) markPoint(i-1,j,M);
        if(!isMarked(i-1,j+1)&&M[i-1][j+1]==1) markPoint(i-1,j+1,M);
        if(!isMarked(i,j-1)&&M[i][j-1]==1) markPoint(i,j-1,M);
        if(!isMarked(i,j+1)&&M[i][j+1]==1) markPoint(i,j+1,M);
        if(!isMarked(i+1,j-1)&&M[i+1][j-1]==1) markPoint(i+1,j-1,M);
        if(!isMarked(i+1,j)&&M[i+1][j]==1) markPoint(i+1,j,M);
        if(!isMarked(i+1,j+1)&&M[i+1][j+1]==1) markPoint(i+1,j+1,M);
    }
    //打印矩阵
    public static void printM(int[][] m){
        int row = m.length;
        int col = m[0].length;
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++){
                System.out.print(m[i][j]+" ");
            }
            System.out.println("");
        }
    }

}
时间: 2024-10-13 11:29:07

百度真题之城市规划(连通域数目)的相关文章

百度真题之走迷宫

题目: 给定一个矩阵,元素1表示可走路径,0表示不可走路径,从左上角开始,目标是值为9的坐标点,判断是否有一个路径到达目的地.如: 1 0 0 0 1 0 1 1 0 0 1 0 0 1 1 9 0 0 0 0 0 1 0 0 该矩阵存在到达数值为9的点的路径 分析: 这题和上一题城市规划的思路一致,只不过这里只要选取左上角第一个点即可.将已搜索的点放入到一个list. 代码: package project001; import java.util.ArrayList; import java

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 勘误1:第6题第4个 if最后一个条件粗心写错了,答案应为1580. 条件应为abs(a[3]-a[7])!=1,宝宝心理苦啊.!感谢zzh童鞋的提醒. 勘误2:第7题在推断连通的时候条件写错了,后两个if条件中是应该是<=12 落了一个等于号.正确答案应为116. 1.煤球数目 有一堆煤球.堆成三角棱锥形.详细: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形). -. 假设一共

蓝桥杯——真题训练之蚂蚁感冒

标题:蚂蚁感冒 长100厘米的细长直杆子上有n只蚂蚁.它们的头有的朝左,有的朝右. 每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒. 当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行. 这些蚂蚁中,有1只蚂蚁感冒了.并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁. 请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒. [数据格式] 第一行输入一个整数n (1 < n < 50), 表示蚂蚁的总数. 接着的一行是n个用空格分开的整数 Xi (-100 < Xi < 100),

第三届蓝桥杯 c/c++真题

第三届蓝桥杯真题 c/c++ 以下题目我自己也并不是所有的题目都是一次性就能做对或是有结题思路的.有些题目也是经过查证网上相关的资料或是参考了别人的代码和解题思路才做出来的.总的来看,这份题目考了很多循环的只是,还有模拟,动态规划的只是. 其中做题过程中,也有了一些新的体会.起初做代码填空题的时候我没办法知道自己做的是对还是错,就跑到网上查答案,后来发现,题目已经给出了代码,起始我们可以自己加上头文件,然后把空缺的代码加上进行调试的,这样就可以验证自己补充的代码是否正确了. 此外在进行调试的时候

第四届蓝桥杯 c/c++真题

第四届蓝桥杯 c/c++真题 <1>高斯日记 问题 大数学家高斯有个好习惯:无论如何都要记日记. 他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210 后来人们知道,那个整数就是日期,它表示那一天是高斯出生后的第几天.这或许也是个好习惯,它时时刻刻提醒着主人:日子又过去一天,还有多少时光可以用于浪费呢? 高斯出生于:1777年4月30日. 在高斯发现的一个重要定理的日记上标注着:5343,因此可算出那天是:1791年12月15日. 高斯获得博士学位的那天日记上标着:

200道历年逻辑推理真题详解

200道历年逻辑推理真题详解 01.粮食可以在收割前在期货市场进行交易.如果预测谷物产量不足,谷物期货价格就会上升:如果预测谷物丰收,谷物期货价格就会下降.今天早上,气象学家们预测从明天开始谷物产区里会有非常需要的降雨.因为充分的潮湿对目前谷物的存活非常重要,所以今天的谷物期货价格会大幅下降. 下面哪个,如果正确,最严重地削弱了以上的观点? A.在关键的授粉阶段没有接受足够潮湿的谷物不会取得丰收. B.本季度谷物期货价格的波动比上季度更加剧烈. C.气象学家们预测的明天的降雨估计很可能会延伸到谷

软件评測师真题解答与分析8

2009上半年真题11: 程序猿甲与同事乙在乙家探讨甲最近编写的程序,甲表示对该程序极不惬意.说要弃之重写,并将程序手稿扔到乙家垃圾桶. 后来乙将甲这一程序稍加改动,并署乙名发表.下面说法正确的是(). A.乙的行为侵犯了甲的软件著作权 B.乙的行为没有侵犯甲的著作权,由于甲已经程序手稿丢弃 C.乙的行为没有侵犯甲的著作权.由于乙已经程序改动 D.甲没有发表该程序并弃之,而乙将程序改动后发表,故乙应享有著作权 分析解答:本题考查知识产权中关于软件著作权方面的知识. 著作权因作品的完毕而自己主动产

2016年上半年软考真题在线模拟测试,提前知晓你的成绩

2016年上半年软考于5月21日结束了,考试完想知道结果的急切心理,几乎每个经历过上学时代的人都能深刻体验到.如果你想知道你考的怎么样,如果你想要提前知道你的成绩,如果你想知道你哪个地方出错了,如果你想知道你哪个地方知识掌握的不够想要更深入的去理解,那就来希赛软考学院吧!希赛软考学院提供2016年上半年软考真题在线模拟测试,有标准的参考答案,有专业老师的解析视频,让你提前知晓你的成绩,让你再次巩固学习. 希赛授课专家介绍 张友生,计算机应用技术博士,软考培训教程系列丛书主编,考试指定教材<系统分

算法笔记_212:第七届蓝桥杯软件类决赛真题(Java语言B组)

目录 1 愤怒小鸟 2 反幻方 3 打靶 4 路径之谜 5 碱基 6 圆圈舞 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 愤怒小鸟 愤怒小鸟 X星球愤怒的小鸟喜欢撞火车! 一根平直的铁轨上两火车间相距 1000 米 两火车 (不妨称A和B) 以时速 10米/秒 相对行驶. 愤怒的小鸟从A车出发,时速50米/秒,撞向B车, 然后返回去撞A车,再返回去撞B车,如此往复.... 两火车在相距1米处停车. 问:这期间愤怒的小鸟撞 B 车多少次? 注意:需要提交的是一个整数(表示撞B车的次数),不要