日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

[C] [编程题]连通块(DFS解决)

發(fā)布時間:2023/11/27 生活经验 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [C] [编程题]连通块(DFS解决) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

時間限制:C/C++ 1秒,其他語言2秒空間限制:C/C++ 256M,其他語言512M
來源:牛客網 金山辦公2020校招服務端開發(fā)工程師筆試題(一)

題目描述

給一個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代碼不是最優(yōu)的,不算很簡潔,因為這是基于我上一篇文章“統(tǒng)計島嶼個數”題目改編的代碼。
  • 我用到的算法是DFS。
  • 了解有關DFS的內容:深度優(yōu)先搜索解決連通塊/染色問題——求島的個數
  • 這題不同的是,輸入數據的時候沒有空格,雖然可以存成char[]字符串形式,但是我用了另一種較為復雜的方法實現(xiàn)。(就是懶得改了。)

題解

#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解决)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。