Luogu P1331 海战
solution
这个题其实还是比较暴力的
关键在于对于每个方阵的处理(其实还是对处理要求比较细的
首先我们得明确搜索的顺序:是从左上到右下的,所以有一些畸形的情况不需要考虑
我们只要check 每一个方正是不是满的就行了
时刻更新最大的节点处
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
#define INF 2147483647
int R,C,Ans,s,ex,ey;
char a[1010][1010];
int u[]={1,-1,0,0};
int v[]={0,0,1,-1};
void dfs(int x,int y){
for(int i=0;i<4;i++){
int xx=x+u[i],yy=y+v[i];
if(xx>0&&xx<=R&&yy>0&&yy<=C&&a[xx][yy]=='#'){
s++;
if(xx>ex||yy>ey)ex=xx,ey=yy;
a[xx][yy]='.';
dfs(xx,yy);
}
}
}
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(a[i][j]=='#'){
s=1;
ex=i;
ey=j;
Ans++;
a[i][j]='.';
dfs(i,j);
if(((ex-i+1)*(ey-j+1))!=s){
cout<<"Bad placement."<<endl;
return 0;
}
}
printf("There are %d ships.\n",Ans);
return 0;
}