演算法設計與分析分支限界演算法之細胞問題

2021-09-29 05:45:11 字數 1200 閱讀 5151

【例】一矩形陣列由數字0到9組成,數字1到9代表細胞,細胞的定義為沿細胞數字上下左右還是細胞數字則為同一細胞,求給定矩形陣列的細胞個數。如:

陣列4 10

0234500067

1034560500

2045600671

0000000089

有4個細胞。

0234500067 按照上下左右的順序進行檢查,並將符合條件的依次入隊

1034560500 解空間是一棵四叉樹

2045600671

0000000089

為避免乙個細胞被重複檢查,需要將檢測過的細胞數字清0

為避免乙個細胞被重複檢查,需要將檢測過的細胞數字清0

0234500067

1034560500

2045600671

0000000089

⑴從檔案中讀入m*n矩陣陣列,將其轉換為boolean矩陣存入bz陣列中;

⑵沿bz陣列矩陣從上到下,從左到右,找到遇到的第乙個細胞;

⑶將細胞的位置入隊h,並沿其上、下、左、右四個方向上的細胞位置入隊,入隊後的位置bz陣列置為false;

⑷將h隊的隊頭出隊,沿其上、下、左、右四個方向上的細胞位置入隊,入隊後的位置bz陣列置為false;

⑸重複4,直至h隊空為止,則此時找出了乙個細胞;

⑹重複2,直至矩陣找不到細胞;

⑺輸出找到的細胞數。

【參考程式】

#includeusing namespace std;

int dx[4]=, // x,y 方向上的增量

dy[4]=;

int bz[100][100],num=0,n,m; //二維陣列,儲存原始矩陣

void doit(int p,int q) //本方向搜尋到細胞就入隊

}}while (t

}int main()

for (i=0;i<=m-1;i++)

for (j=0;j<=n-1;j++)

if (bz[i][j]) doit(i,j); //在矩陣中尋找細胞

printf("number of cells=%d",num);

return 0;

}

分支限界演算法。

分支限界法類似於回溯演算法,是在問題的解空間樹上搜尋問題解的演算法,主要體現在兩點不同 1.求解目標不同。回溯演算法的求解目標是找出解空間樹中滿足約束條件的所有解,而分支限界法的求解目標是找出滿足約束條件的乙個解,或者是在滿足約束條件的解中找出某種意義下的最優解。搜尋解空間樹的方式不同。回溯演算法以...

演算法 分支限界法

在當前節點 擴充套件節點 處,先生成其所有的兒子節點 分支 然後再從當前的活節點 當前節點的子節點 表中選擇下乙個擴充套件節點。為了有效地選擇下乙個擴充套件節點,加速搜尋的程序,在每乙個活節點處,計算乙個函式值 限界 並根據函式值,從當前活節點表中選擇乙個最有利的節點作為擴充套件節點,使搜尋朝著解空...

分支限界演算法(2)

例題四單源最短路徑問題分支限界演算法的資料結構 include include include using namespace std class graphic class pathnode bool operator pathnode b const graphic graphic int n,...