RT,第二个测试点总是过不了
代码如下
#include<cstdio>
#include<iostream>
using namespace std;
inline int read(){
int f=1,s=0;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
s=(s<<3)+(s<<1)+(ch^48);
ch=getchar();
}
return s*f;
}
#define re register
const int N=1e3+5,dx[4]={-1,0,0,1},dy[4]={0,-1,1,0};
int n,m,sum;
char c[N][N];
inline bool pd(int x,int y){
int ans=0;
if(c[x][y]=='#')ans++;
if(c[x+1][y]=='#')ans++;
if(c[x][y+1]=='#')ans++;
if(c[x+1][y+1]=='#')ans++;
return ans==3?false:true;
}
inline void dfs(int x,int y){
for(re int i=0;i<4;i++){
int X=x+dx[i],Y=y+dy[i];
if(X<1||Y>n||X<1||Y>m)
continue;
if(c[X][Y]=='#'){
c[X][Y]='.';
dfs(X,Y);
}
}
}
int main(){
n=read(),m=read();
for(re int i=1;i<=n;i++)
for(re int j=1;j<=m;j++)
cin>>c[i][j];
for(re int i=1;i<n;i++)
for(re int j=1;j<m;j++)
if(!pd(i,j)){
printf("Bad placement.");
return 0;
}
for(re int i=1;i<=n;i++)
for(re int j=1;j<=m;j++)
if(c[i][j]=='#')
dfs(i,j),sum++;
printf("There are %d ships.",sum);
return 0;
}