上代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5;
int n,m,ans;
char mp[N][N];
int dx[]={0,-1,1,0};
int dy[]={-1,0,0,1};
void DFS(int x,int y){//dfs搜索
mp[x][y]='*';//标记
for(int i=0;i<4;i++){
if(x+dx[i]>0&&y+dy[i]>0&&x+dx[i]<=n&&y+dy[i]<=m&&mp[x+dx[i]][y+dy[i]]=='#'){//搜索条件
DFS(x+dx[i],y+dy[i]);//递归搜索
}
}
}
bool P(int x,int y){
int res=0;
if(mp[x+1][y]=='#') res++;
if(mp[x-1][y]=='#') res++;
if(mp[x][y+1]=='#') res++;
if(mp[x][y-1]=='#') res++;
//在2*2的矩阵中有三个就不行
if(res==3){
return false;
}
return true;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>mp[i][j];//输入
}
}
for(int i=1;i<n;i++){
for(int j=1;j<m;j++){//遍历(i+1及j+1会超过n,m,所以小于n,m
if(P(i,j)==false){
cout<<"Bad placement.";
return 0;
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(mp[i][j]=='#'){
ans++;//累加
DFS(i,j);//搜索标记
}
}
}
cout<<"There are "<<ans<<" ships.";
return 0;
}