世界名畫陳列館問題
世界名畫陳列館由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 考慮不足,最終改為...