題目來源:http://oucee.openjudge.cn/17b1/4/ 4:島嶼周長
總時間限制: 1000ms 記憶體限制: 65536kB
描述
用一個n*m的二維數組表示地圖,1表示陸地,0代表海水,每一格都表示一個1*1的地區。地圖中的格子只能橫向或者縱向串連(不能對角串連),串連在一起的陸地稱作島嶼,同時整個地圖都被海水圍繞。假設給出的地圖中只會有一個島嶼,並且島嶼中不會有湖(即不會有水被陸地包圍的情況出現)。請判斷所給定的二維地圖中島嶼的周長。
輸入
第一行為n和m,表示地圖的大小(1<=n<=100, 1<=m<=100)。接下來n行,每行有m個數,分別描述每一格的數值。數值之間均用空格隔開。
輸出
只有一行,即島嶼的周長(正整數)。
範例輸入
3 4
1 1 1 0
0 1 0 0
1 1 0 0
範例輸出
14
-----------------------------------------------------
解題思路
按行和按列統計從0到1變化的次數再乘2
-----------------------------------------------------
代碼
#include<iostream>#include<string.h>using namespace std;int main(){int n, m, i, j;cin >> n >> m;int cnt = 0;int **mat = new int*[n];for (i=0; i<n; i++){mat[i] = new int[m];}for (i=0; i<n; i++){for (j=0; j<m; j++){cin >> mat[i][j];}}if (n==1){cnt = 2;for (i=0; i<m; i++){if (mat[0][i] == 1){cnt += 2;}}return cnt;}if (m==1){cnt = 2;for (i=0; i<n; i++){if (mat[i][0] == 1){cnt += 2;}}return cnt;}for (i=0; i<n; i++){if (mat[i][0] == 1){cnt += 2;}for (j=1; j<m; j++){if (mat[i][j] == 1 && mat[i][j-1] == 0){cnt += 2;}}}for (j=0; j<m; j++){if (mat[0][j] == 1){cnt += 2;}for (i=1; i<n; i++){if (mat[i][j] == 1 && mat[i-1][j] == 0){cnt += 2;}}}cout << cnt;for (i=0; i<n; i++){delete[] mat[i];}delete[] mat;return 0;}