演算法實驗二 回溯法 堡壘問題

2021-09-05 13:04:49 字數 1104 閱讀 7101

時限:1000ms 記憶體限制:10000k  總時限:3000ms

描述城堡是乙個4×4的方格,為了保衛城堡,現需要在某些格仔裡修建一些堡壘。城堡中的某些格仔是牆,其餘格仔都是空格,堡壘只能建在空格裡,每個堡壘都可以向上下左右四個方向射擊,如果兩個堡壘在同一行或同一列,且中間沒有牆相隔,則兩個堡壘都會把對方打掉。問對於給定的一種狀態,最多能夠修建幾個堡壘。

輸入每個測例以乙個整數n(1<=n<=4)開始,表示城堡的大小。接下來是n行字元每行n個,『x』表示該位置是牆,『.』表示該位置是空格。n等於0標誌輸入結束。

輸出每個測例在單獨的一行輸出乙個整數:最多修建堡壘的個數。

輸入樣例

4.x..

....

xx..

....2xx

.x3.x.x.x

.x.3

....xx

.xx4

....

....

....

....

0輸出樣例51

524解析:這是乙個典型的利用回溯法來做的問題。每個格仔都可以選擇放或者不放,最後經過統計得出最大的放置方式。為了簡化起見,我們把4*4的格仔中的牆  『x』  換成0,把空地   『.』  換成1,大炮換成2。同時我們用一維陣列a來記錄當前格仔是否放置了炮,完了之後的checkmax只需要檢查陣列a裡面有多少個1即可。基本思路如下:搜尋這n*n個格仔,不放置a[m]=0,然後搜尋m+1,若能放置(即canplace成立)則放置,a[m]=1,同時對應的c[row][col]=2,最後checkmax,找出最大的放置方法。就構成了回溯法經典的深度優先的二叉樹,最後找的最大值。**如下:

#include

#include

#include

using namespace std;

int n,c[5][5],a[16];

int best,curnum;

int canplace(int m)

for(int i=col;i>=0;i++)

}return 1;

}void search(int m)

getchar();

}search(0);

cout<}return 0;

}

演算法實驗二 回溯法 0 1揹包問題

時限 1000ms 記憶體限制 10000k 總時限 3000ms 描述需對容量為c 的揹包進行裝載。從n 個物品中選取裝入揹包的物品,每件物品i 的重量為wi 價值為pi 對於可行的揹包裝載,揹包中物品的總重量不能超過揹包的容量,最佳裝載是指所裝入的物品價值最高。輸入多個測例,每個測例的輸入佔三行...

演算法實驗4《回溯法》

1.編寫乙個簡單的程式,解決8皇后問題。include using namespace std bool backtrack int list 8 int t return false intmain 2.批處理作業排程問題 問題描述 給定n個作業的集合j j1,j2,jn 每乙個作業ji都有兩項任...

實驗五 回溯法

實驗 五 回溯法 一 實驗目的與要求 1 通過回溯法的示例程式理解回溯法的基本思想 2 運用回溯法解決實際問題進一步加深對回溯法的理解和運用 二 實驗內容 1 分析並掌握 符號三角 問題的回溯法求解方法 2 分析並掌握 n皇后 問題的回溯演算法求解方法 3 練習使用回溯法求解 整數變換 等問題。三 ...