描述
城堡是乙個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 試確定乙個...