求細胞個數
阿新 • • 發佈:2022-03-31
題目
題目描述
一矩形陣列由數字0到9組成。我們把數字1到9稱為細胞數字,數字0稱為非細胞數字。若一個細胞數字上、下、左、右仍是細胞數字,我們則把這些細胞數字稱為同一細胞。 求給定矩形陣列中細胞的個數。
輸入
第1行,整數m、n(m表示行,n表示列、1<=m,n<=1001<=m,n<=100)接下來的m行表示輸入的矩形陣列
輸出
細胞的個數樣例輸入
4 10
0234500067
1034560500
2045600671
0000000089
樣例輸出
4
思路
經典的bfs,只需要記錄x,y。迴圈遍歷每個點,碰到1~9,而且沒有走過,ans++,從這個點開始搜尋連著的一整塊,用一個數組記錄,走過的位置和連著一塊的位置。
實質上就是一個找連通塊的問題,把整個矩陣遍歷一遍,然後把它周圍八個方塊與它相同的全部改成0,直到沒有再和它相同的為止。
BFS版本程式碼
1 #include <bits/stdc++.h> 2 using namespace std; 3 int n, m, ans = 0, dx[8] = {1, -1, 0, 0}, dy[8] = {0, 0, 1, -1}, h[100013][3], zx, zy; 4 char b[103][103]; 5 bool a[103][103]; 6 7 void bfs(int x, int y) 8 { 9 ans++; 10 a[x][y] = false; 11 int head = 1, tail = 1; 12 h[1][1] = x, h[1][2] = y; 13 while (head <= tail) { 14 for (int i = 0; i < 4; i++) { 15 zx = h[head][1] + dx[i]; 16 zy = h[head][2] + dy[i]; 17 if (zx >= 1 && zx <= n && zy >= 1 && zy <= m && a[zx][zy]) { 18 tail++; 19 a[zx][zy] = false; 20 h[tail][1] = zx, h[tail][2] = zy; 21 } 22 } 23 head++; 24 } 25 } 26 27 int main() 28 { 29 cin >> n >> m; 30 for (int i = 1; i <= n; i++) 31 for (int j = 1; j <= m; j++) { 32 cin >> b[i][j]; 33 if (b[i][j] != '0') 34 a[i][j] = true; 35 else 36 a[i][j] = false; 37 } 38 39 for (int i = 1; i <= n; i++) 40 for (int j = 1; j <= m; j++) 41 if (a[i][j]) 42 bfs(i, j); 43 cout << ans << endl; 44 return 0; 45 }
題目
題目描述
一矩形陣列由數字0到9組成。我們把數字1到9稱為細胞數字,數字0稱為非細胞數字。若一個細胞數字上、下、左、右仍是細胞數字,我們則把這些細胞數字稱為同一細胞。 求給定矩形陣列中細胞的個數。
輸入
第1行,整數m、n(m表示行,n表示列、1<=m,n<=1001<=m,n<=100)接下來的m行表示輸入的矩形陣列
輸出
細胞的個數樣例輸入
4 10
0234500067
1034560500
2045600671
0000000089
樣例輸出
4
思路
經典的bfs,只需要記錄x,y。迴圈遍歷每個點,碰到1~9,而且沒有走過,ans++,從這個點開始搜尋連著的一整塊,用一個數組記錄,走過的位置和連著一塊的位置。
實質上就是一個找連通塊的問題,把整個矩陣遍歷一遍,然後把它周圍八個方塊與它相同的全部改成0,直到沒有再和它相同的為止。
BFS版本程式碼
1 #include <bits/stdc++.h> 2 using namespace std; 3 int n, m, ans = 0, dx[8] = {1, -1, 0, 0}, dy[8] = {0, 0, 1, -1}, h[100013][3], zx, zy; 4 char b[103][103]; 5 bool a[103][103]; 6 7 void bfs(int x, int y) 8 { 9 ans++; 10 a[x][y] = false; 11 int head = 1, tail = 1; 12 h[1][1] = x, h[1][2] = y; 13 while (head <= tail) { 14 for (int i = 0; i < 4; i++) { 15 zx = h[head][1] + dx[i]; 16 zy = h[head][2] + dy[i]; 17 if (zx >= 1 && zx <= n && zy >= 1 && zy <= m && a[zx][zy]) { 18 tail++; 19 a[zx][zy] = false; 20 h[tail][1] = zx, h[tail][2] = zy; 21 } 22 } 23 head++; 24 } 25 } 26 27 int main() 28 { 29 cin >> n >> m; 30 for (int i = 1; i <= n; i++) 31 for (int j = 1; j <= m; j++) { 32 cin >> b[i][j]; 33 if (b[i][j] != '0') 34 a[i][j] = true; 35 else 36 a[i][j] = false; 37 } 38 39 for (int i = 1; i <= n; i++) 40 for (int j = 1; j <= m; j++) 41 if (a[i][j]) 42 bfs(i, j); 43 cout << ans << endl; 44 return 0; 45 }