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()
函式中判斷是否合法,返回true
,false
就行。
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飛機。此外,巡洋船隻和艦隊將被派去保護海岸線。不幸的是因為種種原因,國防海軍部僅有很少的幾位軍官能指揮大型海戰。因此,他們考慮培養一些新的海軍指揮官,他們選擇了 海戰 遊戲來幫助學習。在這個著名的遊戲...