[C] [编程题]连通块(DFS解决)
生活随笔
收集整理的這篇文章主要介紹了
[C] [编程题]连通块(DFS解决)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
時間限制:C/C++ 1秒,其他語言2秒空間限制:C/C++ 256M,其他語言512M
來源:牛客網 金山辦公2020校招服務端開發工程師筆試題(一)
題目描述
給一個01矩陣,1代表是陸地,0代表海洋, 如果兩個1相鄰,那么這兩個1屬于同一個島。我們只考慮上下左右為相鄰。
島嶼: 相鄰陸地可以組成一個島嶼(相鄰:上下左右) 判斷島嶼個數。
輸入描述:
第一行輸入兩個數字n,m(1<=n<=200,1<=m<=200)
后面n行01序列,每一行m個字符,表示陸地和海洋
輸出描述:
輸出一個數字表示島嶼的個數
示例1
輸入
5 5
11000
01011
00011
00000
00111
輸出
3
解題思路
- 這里我提供的AC代碼不是最優的,不算很簡潔,因為這是基于我上一篇文章“統計島嶼個數”題目改編的代碼。
- 我用到的算法是DFS。
- 了解有關DFS的內容:深度優先搜索解決連通塊/染色問題——求島的個數
- 這題不同的是,輸入數據的時候沒有空格,雖然可以存成
char[]字符串形式,但是我用了另一種較為復雜的方法實現。(就是懶得改了。)
題解
#include<stdio.h>
struct note
{int x;int y;
};
struct note que[400];
int head, tail;
int a[2000][2000];//地圖
int book[2000][2000];
int next[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
int max = 0;
int sum = 0;
int n, m, startx, starty;void dfs(int x, int y, int color)
{int k;int tx, ty;a[x][y] = color; // 對本格子染色for (k = 0; k < 4; k++){tx = x + next[k][0];ty = y + next[k][1];if (tx < 1 || tx > n || ty < 1 || ty > m)continue;if (a[tx][ty] > 0 && book[tx][ty] == 0){book[tx][ty] = 1;dfs(tx, ty, color);}}return;
}int main()
{int i, j;int num = 0;char c;scanf("%d %d", &n, &m);getchar();for (i = 1; i <= n; i++){for (j = 1; j <= m; j++){c = getchar();a[i][j] = c - '0';}getchar();}for (i = 1; i <= n; i++){for (j = 1; j <= m; j++){if (a[i][j] > 0){num--;// num表示色號,并且是負數book[i][j] = 1;dfs(i, j, num);}}}printf("%d", -num);return 0;
}
總結
以上是生活随笔為你收集整理的[C] [编程题]连通块(DFS解决)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国非物质文化遗产大使是什么意思?
- 下一篇: [C] 图的深度优先遍历