问题如标题
请dalao不要吐槽我什么都不说直接贴代码,请相信本蒟蒻已经尽力了,实在找不到什么能再优化的点了
本来想用这道题练bfs,结果一直调到电脑没电,现在用最后一点电量写这个求助帖,如果dalao们发现我没有回应那就代表本蒟蒻的电脑已经死了
#include<bits/stdc++.h>
using namespace std;
struct node{
int x,y;
};
int R,C;
bool m[1010][1010];
//邪教优化,用bool存图省空间(然而还是没过)
int dx[5]={0,1,0,-1,0};
int dy[5]={0,0,1,0,-1};
queue<node>q;
int main()
{
int ans=0;
char a;
memset(m,0,sizeof(m));
cin>>R>>C;
for(int i=1;i<=R;i++)
for(int j=1;j<=C;j++)
{
cin>>a;
if(a=='.')
m[i][j]=0;
else m[i][j]=1;
//#标记为1,.标记为0
}
int cnt;
for(int i=1;i<R;i++)
for(register int j=1;j<C;j++)
{
cnt=0;
if(m[i][j]==1) cnt++;
if(m[i+1][j]==1) cnt++;
if(m[i][j+1]==1) cnt++;
if(m[i+1][j+1]==1) cnt++;
if(cnt==3)
{
cout<<"Bad placement.";
return 0;
}
}
//判矩形
node p;
int r,c;
for(int i=1;i<=R;i++)
for(int j=1;j<=C;j++)
{
if(!m[i][j])
continue;
ans++;
q.push((node){i,j});
while(!q.empty())
{
p=q.front();
q.pop();
r=p.x,c=p.y;
m[r][c]=0;
for(int i=1;i<=2;i++)
{
if(!m[r+dx[i]][c+dy[i]])
continue;
q.push((node){r+dx[i],c+dy[i]});
}
//只搜右下两个方向,因为向左上往回搜的一定不是矩形,已经被排除
}
}
printf("There are %d ships.",ans);
}