世界名畫陳列館問題

2021-10-17 07:47:15 字數 2109 閱讀 9182

世界名畫陳列館問題(回溯法)

此為《計算機演算法設計與分析 第5版》王曉東 中習題作業

1.陣列界線沒有考慮清楚,出現越界;在change和restore只考慮i-1和j-1有沒有出界,忘了考慮i+1和j+1有沒有出界

2.找到未被監視的陳列館迴圈中,對最後乙個房間(m-1,n-1)考慮不足,最終改為break出

3.找到一組解的判斷條件錯誤,最初判斷是i和j都到邊界m-1、n-1,沒有結合迴圈考慮

4.change和restore應該保持一致

5.沒有儲存當前警衛布置

6.對remainingroom資訊的更改沒考慮到

7.對三個if的處理仍有問題,如何解決陣列過界問題,如果不進行邊界判斷,就沒辦法進行剪枝判斷,考慮重新寫個函式判斷

/*

***題目:演算法設計與分析世界名畫陳列館問題

*輸入要求:input.txt

m(矩陣行數) n(矩陣列數)

*輸出要求:ouput.txt

bestgurad(最佳警衛數)

guardplace(警衛位置矩陣)

*求解演算法:回溯法

*/#include

#include

using

namespace std;

class

solution

if(i==m)

break;}

//查詢到一組解,判斷是否為最優,是則保留替換

if(i>=m)}}

return;}

//當前警衛數+(還剩房間數+4)/5 >= bestguard,則認為不會更佳,剪枝

if(currentguard+

(remainingroom+4)

/5>= bestguard)

if(i

if(j

}else}if

(1)}

}else

}else

}else}}

}//初始化各變數

void

init

(void

)for

(int i=

0;i)else}}

//建立展覽室位置二維陣列並將元素均初始化為0

displayroom =

newint

*[m]

;for

(int i=

0;i)for

(int i=

0;i//建立存放當前警衛布置情況的陣列

currentguardplace =

newint

*[m]

;for

(int i=

0;i)for

(int i=

0;i}//輸入函式,讀入檔案變數

void

input

(void

)//輸出函式,輸出最佳結果並釋放陣列空間

void

output

(void

)fprintf

(fp,

"\n");

}for

(int i=

0;iint*

*returnpointer

(void

)private

://撤銷(i,j)處的機械人,並改變周圍展覽室狀態及剩餘未監視房間數

void

restore

(int i,

int j)

if(j+

1<=n-1)

if(j-

1>=0)

if(i-

1>=0)

}//在(i,j)放置乙個機械人,並改變周圍展覽室狀態及剩餘未監視房間數

void

change

(int i,

int j)

if(i+

1<=m-1)

if(i-

1>=0)

if(j-

1>=0)

}};int

main

(void

)

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...

世界名畫陳列館問題

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