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.
",Ans);
  return 0;
}

原文地址:https://www.cnblogs.com/KingBenQi/p/12289662.html