世界名畫陳列館問題(回溯法)
此為《計算機演算法設計與分析 第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個排列成矩形陣列的陳列室組成。為了防止名畫被盜,需要在陳列室中設定機械人哨位。每個警衛機械人除了監視它所在的陳列室外,還可以監視與它所在的陳列室相鄰的上下左右四個陳列室。試設計乙個安排警衛機械人哨位的演算法,使名畫陳列館中每乙個陳...