uva572 dfs求八連塊

2021-07-12 05:04:02 字數 1637 閱讀 4905

題意:

輸入乙個 m 行 n 列的字元矩陣,統計字元 @ 能組成多少八連塊,如果兩個字元 @ 所在的格仔相鄰(橫豎或者對角線的方向),就

說他們組成了乙個八連塊,問圖中一共有多少個八連塊。

sample input:

1 1 *

3 5*@*@*

**@**

*@*@*

1 8@@****@*

5 5****@

*@@*@

*@**@

@@@*@

@@**@

0 0sample output: 0

1 22

分析:圖和二叉樹一樣,也有自己的dfs 和 bfs遍歷,一般dfs用來求連通塊問題,bfs用來找最短路問題,這個題目就是乙個典型的dfs求八

連塊的問題,可以從每個 @ 字元出發,遞迴遍歷他周圍八個方向的字元,看是否是 @ 格仔,如果是就標記一下,證明該格仔遍歷

過,這樣在以後的訪問的時候,就能知道他是否被訪問過,從而避免同乙個格仔被訪問多次。下面的**用乙個二重迴圈來尋找八

連塊,當然也可以用常量陣列或者8條dfs遍歷,在這裡說一下,圖的dfs遍歷用遞迴實現,bfs遍歷則是用佇列(或者陣列)實現,

類似的還有求二連塊,四連塊,等等,都可以用dfs遍歷來實現,只需要改一下行走函式就可以。

下面上**:

#include #include #include #include using namespace std;

int n, m, maxz[105][105];

char str[105][105];

void dfs(int r,int c,int id)

int main()

}cout <

下面上四連塊:

#include #include #include #include using namespace std;

const int maxn=100+5;

int maze[maxn][maxn];///頂點訪問狀態

int r,c,k;///r行c列k個水塊

int cnt,ans;///cnt是計算訪問的格仔數

///兩個表示方向陣列

int dr= ; //上,下,左,右

int dc= ;

void dfs(int r,int c) ///r是行座標,c是列座標

int main()

ans=0;

for(int i=1; i<=r; i++)

for(int j=1; j<=c; j++)

if(maze[i][j]==1)

printf("%d\n",ans);

}return 0;

}

下面上二連塊:

**實現:

#include #include #include #include using namespace std;

int map[650][650],p[650][650],x[650],y[650],vis[650];

int n,num,t,k;

char s[650][650];

bool search(int i)///其實就是乙個dfs

for(int i=0;i

uva572 油田 DFS或者並查集 1

給你一塊地圖 其中 代表探測到有油的地方,而 則是代表沒有油的地方。現在題目給出了油田的定義,所有連在一起的 代表乙個油田,而連在一起的定義是有公共點或公共邊。而題目的要求是輸出給你一張地圖上的油田的個數。思路 這個題沒什麼特別的思路,就是找到乙個初始的 然後遍歷一遍,把與他屬於同乙個油田的都標記了...

例題 油田(UVa 572)

輸入乙個m行n列的字元矩陣,統計字元 組成多少個八連塊。如果兩個字元 所在的格仔相鄰 橫豎或者對角線方向 就說他們屬於同乙個八連塊。sample input 1 1 3 5 sample output01 分析 dfs基礎題,典型題。用dfs找聯通塊 從每個 格仔出發,遞迴遍歷它周圍的 格仔。每次訪...

種子填充演算法(Uva 572

題目描述 給定乙個m n的矩陣,由 和 組成。求 一共有幾塊是連通的。思路 使用dfs遍歷,即找到乙個 後,將與之在同一塊的 均標記,之後碰到就可以忽略。然後遍歷一遍矩陣即可。如下 include include include define clean i memset i,0,sizeof i ...