P1331 海戰(洛谷)

2022-08-17 15:12:19 字數 1908 閱讀 4975

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

在這個著名的遊戲中,在乙個方形的盤上放置了固定數量和形狀的船隻,每只船卻不能碰到其它的船。在這個題中,我們僅考慮船是方形的,所有的船隻都是由圖形組成的方形。編寫程式求出該棋盤上放置的船隻的總數。

輸入檔案頭一行由用空格隔開的兩個整數r和c組成,1<=r,c<=1000,這兩個數分別表示遊戲棋盤的行數和列數。接下來的r行每行包含c個字元,每個字元可以為「#」,也可為「.」,「#」表示船隻的一部分,「.」表示水。

為每乙個段落輸出一行解。如果船的位置放得正確(即棋盤上只存在相互之間不能接觸的方形,如果兩個「#」號上下相鄰或左右相鄰卻分屬兩艘不同的船隻,則稱這兩艘船相互接觸了)。就輸出一段話「there are s ships.」,s表示船隻的數量。否則輸出「bad placement.」。

輸入

6

8.....#.#

##.....#

##.....#

.......#

#......#

#..#...#

輸出

there are 5 ships.

題解思路:

這道題可以拿bfs和dfs進行解決(本題使用的是bfs),但題目的關鍵應該不是卡你會不會bfs或者dfs,難點在於如何去判斷某個船體是否為「方形」。

判斷船體是否為「方形」的方法:

法①:直接對輸入的二維char型矩陣中去判斷,每四個一組(不符合方形的情況都能歸結到最終四種情況,因此以這個為基礎去列舉判斷),不符合就退出。判斷結束後都符合是方形則再繼續bfs

法②:結合bfs進行判斷,通過面積來判斷  因為剛好符合從上到下、從左到右的搜尋,並且符合矩形的特點,若乙個圖形是矩形則它的起始搜尋點(左上角的點)一定是最小的橫縱座標,所以只需要搜尋圖中的最大橫縱座標,對應相減再相乘求出矩形面積;另外,再搜尋的過程中記錄船體所佔的數量(#數量);搜尋結束後如果兩者相等則代表當前船體滿足方形要求。

解題**:

#include#include

#include

#include

using

namespace

std;

intn,m;

const

int maxn=1000+5

;char s[maxn][maxn]; //

0的部分代表有水

int color[maxn][maxn]=;

int sum=0; //

記錄船總數

typedef pairp;

int dx[4]=;

int dy[4]=;

//思路:在bfs中進行判斷是否是矩形

int bfs(int x,int y)

if(ty>=maxy)

que.push(p(tx,ty));

//壓入佇列

color[tx][ty]=2

; num++;}}

}int area=(maxx-x+1)*(maxy-y+1); //

求面積if(area==num)

else

return

false;}

intmain()}}

for(int i=1;i<=n;i++)

else}}

}cout

<<"

there are

"<"

ships.";

return0;

}

洛谷P1331海戰

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

洛谷P1331海戰

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

P1331 海戰 洛谷

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