題意:
輸入乙個 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 ...