題目背景
在峰會期間,武裝部隊得處于高度戒備。警察將監視每一條大街,軍隊將保衛建筑物,領空將布滿了 F-2003 飛機。
此外,巡洋船只和艦隊將被派去保護海岸線。不幸的是,因為種種原因,國防海軍部僅有很少的幾位軍官能指揮大型海戰。因此,他們培養了一些新海軍指揮官。軍官們選擇了“海戰”游戲來幫助他們學習。
題目描述
在一個方形的盤上,放置了固定數量和形狀的船只,每只船卻不能碰到其它的船。在本題中,我們認為船是方形的,所有的船只都是由圖形組成的方形。
求出該棋盤上放置的船只的總數。
輸入格式
第一行為兩個整數?R?和 C,用空格隔開,分別表示游戲棋盤的行數和列數。
接下來?R?行,每行?C?個字符,為?#
?或?.
。#
?表示船只的一部分,.
?表示水。
輸出格式
一行一個字符串,如果船的位置放得正確(即棋盤上只存在相互之間不能接觸的方形,如果兩個?#
?號上下相鄰或左右相鄰卻分屬兩艘不同的船只,則稱這兩艘船相互接觸了)。就輸出?There are S ships.
,S?表示船只的數量。否則輸出?Bad placement.
。
輸入輸出樣例
輸入 #1復制
6 8 .....#.# ##.....# ##.....# .......# #......# #..#...#
輸出 #1復制
There are 5 ships.
思路
用dfs判斷相鄰,用pd判斷合法,在main函數里統計船的數量
#include<bits/stdc++.h>
using namespace std;
int r,c,s=0;
int dx[4]={0,-1,1,0},dy[4]={-1,0,0,1};
char a[1005][1005];
void dfs(int x,int y)
{a[x][y]='%';for(int i=0;i<4;i++){if(x+dx[i]>0&&x+dx[i]<=r&&y+dy[i]>0&&y+dy[i]<=c&&a[x+dx[i]][y+dy[i]]=='#')dfs(x+dx[i],y+dy[i]);}
}
bool pd(int i,int j)
{int cnt=0;if(a[i][j]=='#')cnt++;if(a[i+1][j]=='#')cnt++;if(a[i][j+1]=='#')cnt++;if(a[i+1][j+1]=='#')cnt++;if(cnt==3)return false;return true;
}
int main()
{cin>>r>>c;for(int i=1;i<=r;i++){for(int j=1;j<=c;j++)cin>>a[i][j];}for(int i=1;i<=r;i++){for(int j=1;j<=c;j++){if(i<r&&j<c&&pd(i,j)==0){cout<<"Bad placement.";return 0;}}}for(int i=1;i<=r;i++){for(int j=1;j<=c;j++){if(a[i][j]=='#'){s++;dfs(i,j);}}}cout<<"There are "<<s<<" ships.";return 0;
}