码迷,mamicode.com
首页 > 其他好文 > 详细

中兴捧月蓝剑之路初赛题目——数房子

时间:2016-06-15 10:57:42      阅读:3181      评论:0      收藏:0      [点我收藏+]

标签:

 

  题目回忆:航拍一块矩形空地的俯视图,用数字0或1分别表示某位置看到的是空地还是屋顶,相邻的屋顶属于同一栋房子,位于对角线上的屋顶不属于同一栋房子(这也符合实际),现在先输入空地的大小,再输入矩形俯视图的布局,要求我们输出这块矩形空地中有多少栋房子

  

  测试用例:


 

  TestCase 1:

 

  Input:

  5    5

  0    1    0    0    0

  0    0    1    1    0

  0    0    0    1    0

  0    0    0    0    0

  0    0    0    0    0

  Expected Return Value:

  2


 

  TestCase 2:

 

  Input:

  5    6

  0    1    0    0    1    0

  0    1    1    1    0    0

  0    0    0    1    0    0

  0    0    0    0    1    1

  0    0    0    0    1    1

  Expected Return Value:

  3


 

  不是什么难题,网上有人用递归做的,太麻烦,效率也不高,这里我用空间换时间,用两个标志数组来标志当前位置左边和上边是否有屋顶,一开始从左上方开始扫描,动态更新标志数组,只有当某位置的左边和上边都没有屋顶时才进行计数,扫描结束即得出房子的数目。比赛中我的程序顺利通过了官方的两个测试用例,但是后来我发现我的两个标志数组在某些输入的情况下会发生溢出,都是泪啊,改正后的Java源码如下:

 

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Scanner scan = new Scanner(System.in);
        while(scan.hasNext())
        {
            int row = scan.nextInt();
            int col = scan.nextInt();
            int[][] matrix = new int [row][col];
            for(int i = 0; i < row; i++)
            {
                for(int j = 0; j < col; j++)
                {
                    matrix[i][j] = scan.nextInt();
                }
            }
            System.out.println(CountHourse.doCountHourse(row, col, matrix));
            
        }
        scan.close();
    }

}

class CountHourse {

    public static int doCountHourse(int row, int col, int[][] matrix)
    {
        // 注意:加1防止越界
        boolean[][] leftRoof = new boolean[row + 1][col + 1];// 标志该位置的左边是否有屋顶
        boolean[][] topRoof = new boolean[row + 1][col + 1]; // 标志该位置的上方是否有屋顶
        int count = 0;
        for(int i = 0; i < row; i++)
        {
            for(int j = 0; j < col; j++)
            {
                if(matrix[i][j] == 1)
                {
                    leftRoof[i][j + 1] = true;
                    leftRoof[i + 1][j] = true;
                    if( (!leftRoof[i][j]) && (!topRoof[i][j]) )
                        count++;
                }
            }
        }
        return count;
    }
}

 

中兴捧月蓝剑之路初赛题目——数房子

标签:

原文地址:http://www.cnblogs.com/eniac12/p/5586383.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!