絡谷 P1331 海戰

2021-10-03 11:53:35 字數 1983 閱讀 9151

get to point first. the article comes from lawsonabs

0.總結

0.1 如何判斷船隻合法?

利用深蒐時記錄下的資訊結合題意設定判斷規則,詳見2.2

1.題目

鏈結。2.思想

2.1 如何得到船隻

這部分直接dfs 即可,然後就把得到的船隻用vis陣列標記一下,下次不再訪問了,但問題就是如何判斷這次深搜的船隻是兩隻或多隻船隻的「組合品」,即題目中所說的bad placement?請往下看。

2.2如何判斷船隻合法

方形的定義是:「長方形和正方形統稱為方形」。可以粗略的將方形的定義看作是矩形。所以,我們需要判斷我們當前深搜得到的圖形是否是矩形即可。這個也很好想到,矩形的特點就是很規整。(行的長度與列的長度固定)。這樣我們就可以遍歷每行的長度是否相同,每列的長度是否相同。如果二者分別相同,那麼就是乙個方形,也就是乙個合法的船隻。舉例說明。

###

###

是合法的船隻,第一行長度為3,第二行長度也為3;第一列長度為2,第二,三列長度也為2。故合法,是乙個船隻。

....#.

....#.

....#.

....##

可以看到行上的』#'數並不完全相同,列上的『#』也不相同,故不合法。

我們用乙個行列陣列,標記在深搜訪問時得到的船隻位置,然後在check()函式中判斷是否合法,返回truefalse就行。

3.**

#include

#include

#include

using namespace std;

const

int maxr =

1005

;char map[maxr]

[maxr]

;//地圖

int row[maxr]

,col[maxr]

;//行列分別有多少船隻

int vis[maxr]

[maxr]

;//訪問資訊

int r,c,ans;

int dx[4]

=, dy[4]

=;//檢查座標(x,y)點所在的船隻的行列資訊

bool check()

}for

(;i)for

(j =

0;jfor(

;j)return true;

}//(cx,cy)為當前的判斷座標

void

dfs(

int cx,

int cy)}}

intmain()

}fill

(vis[0]

,vis[0]

+maxr*maxr,0)

;for

(int i =

0;i< r;i++)}

}}cout <<

"there are "

<" ships.\n"

;return0;

}

4.測試用例
6 8

.....#.#

##.....#

##.....#

.......#

#......#

#..#..##

4 8.....#.#

##.....#

##.....#

#......#

5 8.....#.#

##.....#

##.....#

.......#

#......#

6 8.....#.#

##.....#

##.....#

.......#

#......#

#..#...#

洛谷P1331海戰

題目傳送門 這道題的難點在於判斷是否有船相鄰。通過自己模擬的資料可以得出結論 如果圖是不和法的,一定存在如下結構 或 或 或 即在乙個2 2的方格中有三個 因為題裡說船是方形的,即只能是橫條或豎條 剛開始不審題爆掉了37分 於是就有判斷 boold int i,int j if a i 1 j if...

洛谷P1331海戰

題目描述題目描述 在峰會期間,武裝部隊得處於高度戒備。警察將監視每一條大街,軍隊將保衛建築物,領空將布滿了f 2003飛機。此外,巡洋船隻和艦隊將被派去保護海岸線。不幸的是因為種種原因,國防海軍部僅有很少的幾位軍官能指揮大型海戰。因此,他們考慮培養一些新的海軍指揮官,他們選擇了 海戰 遊戲來幫助學習...

P1331 海戰 洛谷

在峰會期間,武裝部隊得處於高度戒備。警察將監視每一條大街,軍隊將保衛建築物,領空將布滿了f 2003飛機。此外,巡洋船隻和艦隊將被派去保護海岸線。不幸的是因為種種原因,國防海軍部僅有很少的幾位軍官能指揮大型海戰。因此,他們考慮培養一些新的海軍指揮官,他們選擇了 海戰 遊戲來幫助學習。在這個著名的遊戲...