1. 程式人生 > >noj算法 堡壘問題 回溯法

noj算法 堡壘問題 回溯法

輸入 stdio.h ostream iostream 兩個 amp 上下 都是 lse

描述:

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

輸入:

每個測例以一個整數n(1<=n<=4)開始,表示城堡的大小。接下來是n行字符每行n個,‘X’表示該位置是墻,‘.’表示該位置是空格。n等於0標誌輸入結束。

輸出:

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

輸入樣例:

4
.X..
....
XX..
....
2
XX
.X
3
.X.
X.X
.X.
3
...
.XX
.XX
4
....
....
....
....
0

輸出樣例:

5
1
5
2
4

題解:

逐個地點的搜索是否能放堡壘,並利用一個回溯,求出所有結果。

代碼:

#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
char a[5][5]={0};
int maxn=0,cur=0;   //maxn記錄最終最優解,cur記錄每一次最優解

bool iscanput(int x,int y,int n)
{
    int r=x;
    int c=y;
    if(a[x][y]!=
.) return false; while(y>=0&&a[r][y]==.) {y--;} if(y<0||(y>=0&&a[r][y]==X)){ while(x>=0&&a[x][c]==.) x--; if(x<0||(x>=0&&a[x][c]==X)) return true; } return false; } void Search(int i,int n) {
int x=i/n; int y=i%n; if(i==n*n){ if(maxn<cur) maxn=cur; } else{ if(iscanput(x,y,n)){ //看(x,y)是否能存放堡壘 a[x][y]=T; cur++; Search(i+1,n); cur--; a[x][y]=.; } Search(i+1,n); } } int main() { int n,i,j; while(cin>>n,n){ maxn=0; cur=0; for(i=0;i<n;i++) for(j=0;j<n;j++) cin>>a[i][j]; Search(0,n); cout<<maxn<<endl; } return 0; }

noj算法 堡壘問題 回溯法