标签:
题目回忆:航拍一块矩形空地的俯视图,用数字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