回溯法 堡壘問題

2021-07-24 13:20:51 字數 1377 閱讀 1576

描述

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

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

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

輸入樣例 4

.x..

....

xx..

....2xx

.x3.x.x.x

.x.3

....xx

.xx4

....

....

....

....0

輸出樣例 5

1524

基本思路:想法同8皇后。不同的是,堡壘問題可以在格仔上不放堡壘,而八皇后必須要在一行放乙個(以我寫的**說明),所以,堡壘問題必須要在if(canplace())前進行search(m+1),或者之後也行。差別就在這裡。**如下,已經經過測試。

#include using namespace std;

int n, big;

int a[4][4];

void search(int m);

int canplace(int m);

void place(int m);

void takeout(int m);

void checkmax();

int main()

}search(0);

cout << big << endl;

big = 0;

/*for(int i = 0; i < n; i++)

cout << endl;

} */

cin >> n;

}}void search(int m)

else

}}int canplace(int m)//因為是逐行搜尋,所以只要判斷在當前位置上方和左方即可。

if(a[row][i] == 1)

}for(int i = row; i >= 0; i--)

if(a[i][col] == 1)

}if(a[row][col] == 1)return 0;

return 1;

}void place(int m)

void takeout(int m)

void checkmax()

if(num > big)big = num;

}

回溯法 解決堡壘問題

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

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

時限 1000ms 記憶體限制 10000k 總時限 3000ms 描述城堡是乙個4 4的方格,為了保衛城堡,現需要在某些格仔裡修建一些堡壘。城堡中的某些格仔是牆,其餘格仔都是空格,堡壘只能建在空格裡,每個堡壘都可以向上下左右四個方向射擊,如果兩個堡壘在同一行或同一列,且中間沒有牆相隔,則兩個堡壘都...

回溯法,回溯法解裝載問題

利用回溯法解問題時一般按以下三步驟 1 定義問題的解空間 2 確定易於搜尋的解空間結構 3 以深度優先策略搜尋解空間,並在搜尋過程中用剪枝函式避免無效搜尋 二 回溯法應用 裝載問題 一批貨櫃共n個要裝上2艘載重量分別為c1和c2的輪船,其中貨櫃i的重量為wi且w1 w2 wn c1 c2 試確定乙個...