世界名畫陳列館問題

2021-10-07 06:28:35 字數 2384 閱讀 3010

世界名畫陳列館問題

世界名畫陳列館由m×n

m\times n

m×n個排列成矩形陣列的陳列室組成。為了防止名畫被盜,需要在陳列室中設定機械人哨位。每個警衛機械人除了監視它所在的陳列室外,還可以監視與它所在的陳列室相鄰的上下左右四個陳列室。試設計乙個安排警衛機械人哨位的演算法,使名畫陳列館中每乙個陳列室都在警衛機械人的監視之下,且所用的警衛機械人人數最少。

資料範圍:

1 ≤m

,n≤20

1\leq m,n\leq 20

1≤m,n≤

20

題目要求使用優先佇列式分支限界法

首先設定乙個類node,用來儲存該問題所進行搜尋的樹的節點。該問題中用來評估的標準應當是當前已經安排的警衛機械人數目,用來進行優先佇列排序的時候,也應當用該標準進行排序。因此過載node中的<運算子如下:

bool

operator

<

(const node& a,

const node& b)

//過載小於符號,用來進行優先佇列的排序,確保永遠是使用機械人最少的節點靠前

然後初始化乙個節點tmp,然後將其壓入優先佇列heap中,一次性生成其所有的子節點,將其進行壓入heap中,然後把原來的節點tmp彈出heap中,每一次都選取優先佇列的top元素。一直這樣迴圈操作,一直到heap為空,或者是當前找到的節點已經觀察了陳列室中的所有位置。

while

(!heap.

empty()

)//只要heap不為空,一直進行下去

else

heap.

pop();

//彈出堆頂元素

}

至於生成子節點的演算法,主要依據的是當前待放置的位置i,j而定的。永遠map[i][j +1]都是乙個好的選擇,如果map[i + 1][j]沒有監視,或者map[i + 2][j]沒有監視,那麼map[i + 1][j]放置是個很好的選擇。如果map[i + 1][j]map[i][j+1]都沒有被監視,map[i][j]也是個很好的選擇。

#include

#include

#include

using

namespace std;

class

solve

;class

node

//node節點,用來存放搜尋樹的節點

if(y)

}delete

x;delete

y;x =

null

; y =

null;}

i = a.i;

j = a.j;

robotnums = a.robotnums;

beenmonitored = a.beenmonitored;

m = a.m;

n = a.n;

x =newint

*[m +2]

; y =

newint

*[m +2]

;for

(int i =

0; i < m +2;

++i)

}return

*this;}

~node()

;//用到了new,因此析構函式要過載,避免記憶體洩露};

class

solve

//解決問題的類

;int

main()

int m, n;

fcin >> m >> n;

fcin.

close()

; solve solve

(m, n)

; ofstream fcout;

fcout.

open

("output.txt");

if(!fcout.

is_open()

) solve.

run(fcout)

; fcout.

close()

;return0;

}

C 世界名畫陳列演算法

using system using system.collections.generic using system.linq using system.text namespace 5 hou 0,1 7 hou 0,0 1 hou 0,2 1 hou 1,1 1 for int i 0 i n ...

世界名畫陳列館問題

include include include include using namespace std const int max 10 int best max max 機械人位置 int m,n 矩陣為 m n int bestk 機械人個數 int dx 原位置及四個方向 int dy voi...

世界名畫陳列館問題

世界名畫陳列館問題 回溯法 此為 計算機演算法設計與分析 第5版 王曉東 中習題作業 1.陣列界線沒有考慮清楚,出現越界 在change和restore只考慮i 1和j 1有沒有出界,忘了考慮i 1和j 1有沒有出界 2.找到未被監視的陳列館迴圈中,對最後乙個房間 m 1,n 1 考慮不足,最終改為...