NOJ 1006 堡壘問題

2021-08-29 01:25:30 字數 1314 閱讀 2430

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

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

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

4

.x……

xx……2xx

.x3.x.x.x

.x.3

….xx

.xx4……

……0

515

24

#include

#include

#include

#include

using

namespace std;

int n,num,maze[10]

[10],ans;

char maze1[10]

[10];

intcanplace

(int x,

int y)

//因為求解按次序搜尋,所以只搜尋右上部分即可

for(i=y-

1; i>=

0; i--

)return1;

}void

search

(int m)

ans=

max(ans,num);}

else

search

(m+1);

if(maze[x]

[y]!=1)

}}int main ()}

ans=0;

search(0

);printf

("%d\n"

,ans);}

return0;

}

堡壘問題仍舊屬於回溯法。限制條件體現在canplace()函式上,由於遍歷,所以只用分析右上部分,分別保持行、列不變,從當前位置向前遍歷,如果先遇到牆壁,說明堡壘安全,跳出迴圈,如果先遇到堡壘,說明堡壘不可放,函式結束,返回0。否則返回1。

在回溯過程中,如果判斷可以放,那麼放置堡壘,之後在當前位置放堡壘的情況下search(m+1)得到乙個答案,如果不可以放,在當前位置不放堡壘的情況下直接search(m+1)得到乙個答案。之後,如果當前位置不是牆壁的話,將當前位置歸回為0。再進行下一次search。

演算法練習 NOJ 1006 堡壘問題

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

noj 1006 多項式乘法

對於輸入,由於是按指數遞減輸入的,故我們只需按照輸入順序進行儲存即可。對待乙個輸入 1.如果當前多項式為空,那麼將此項放入第一項 2.如果當前多項式不為空 3.如果有指數相同的項,那麼將此項與指數相同的項合併,如果係數變為0,則將此項刪除。然後多項式乘法,即將第乙個多項式的項和第二個多項式每一項分別...

回溯法 堡壘問題

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