统计住宅_百度笔试

来源:互联网 发布:js判断页面加载完毕 编辑:程序博客网 时间:2024/06/11 15:47

题目:

有一片区域统计住宅数量,用nxm的矩阵表示,其中0表示空地,1表示住宅。有一条原则,如果1和1是上下或左右相邻,那么就看做是一套住宅,对角相邻不算。


比如:

1 0 0 0

0 1 0 0

0 1 1 0

0 0 0 0  结果为2。


思路:用区域生长的方式来做,类似于病毒的感染,感染的规则就是相邻的元素。每个元素遍历后,如果是1那么就住宅数量+1,并将其置为-1(表示统计过了),右边和下面的元素和这个-1相乘,被“感染”为-1。如果是0则什么都不做。如果是-1就么就接着“感染”它的右和下的为1的元素,-1不统计如住宅。


//得到nxm的格点中总共的房子数量int Gethouse(int **grid, int n, int m){if (n <= 0 || m <= 0)return 0;int i, j;int count = 0;//房子的数量for (i = 0; i < n; i++){for (j = 0; j < m; j++){if (grid[i][j] == 1){count++;grid[i][j] = -1;//表示已查看过if (i < n - 1){grid[i + 1][j] = -grid[i + 1][j];}if (j < m - 1){grid[i][j + 1] = - grid[i][j + 1];}}else if (grid[i][j] == -1){if (i < n - 1){if (grid[i + 1][j] == 1)grid[i + 1][j] = -1;}if (j < m - 1){if (grid[i][j + 1] == 1)grid[i][j + 1] = -1;}}}}return count;}int main(){int **arr = new int *[4];for (int i = 0; i < 4; i++)arr[i] = new int[4];while (1){for (int i = 0; i < 4; i++)for (int j = 0; j < 4; j++)cin >> arr[i][j];int cnthouse = Gethouse(arr, 4, 4);cout << cnthouse << endl;}return 0;}






0 0