D. BLOCKS 2014新生暑假个人排位赛01
时间限制 1000 ms
内存限制 65536 KB
题目描述
给定一个 N∗M 的矩阵,求问里面有多少个由'#'组成的矩形,"There are 5 ships.",若是里面有一个不是矩形的联通块,则输出"So Sad"
输入格式
1≤n,m≤1000
有多组数据,EOF结束。
输出格式
每行对应一个answer
输入样例
6 8
.....#.#
##.....#
##.....#
.......#
#......#
#..#...#
6 8
.....#.#
##.....#
###...##
.......#
##.....#
#..#...#
输出样例
There are 5 ships.
So Sad
赛中提交:T
赛后ac:Y
题目大意:在矩阵里面找出独立的由#组成的区域个数
思路:
裸的广搜
赛中为何不过:
真心不懂- -赛后直接复制赛中提交的再提交一次一样的就过了
代码如下
#include "iostream"
#include "string.h"
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "string"
#include "vector"
#include "list"
#include "map"
#include "queue"
#include "stack"
#include "bitset"
#include "algorithm"
#include "numeric"
#include "functional"
using namespace std;
typedef pair<int ,int > P;
int n,m;
int u,d,l,r,counta,countaa;
char c[1005][1005];
int vis[1005][1005];
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
void bfs(int bx,int by)
{
P p,tempt;
queue<P> que;
tempt.first=bx,tempt.second=by;
que.push(tempt);
vis[bx][by]=1;
while(que.size()){
int x,y;
counta+=1;
tempt=que.front();
que.pop();
x=tempt.first,y=tempt.second;
//printf("\n\nque.size()=%d 取%d %d\n",que.size(),x,y);
l=min(y,l);
r=max(y,r);
u=max(x,u);
d=min(x,d);
//printf("上%d下%d左%d右%d\n",u,d,l,r);
for(int i=0;i<4;i+=1){
int nx=x+dx[i],ny=y+dy[i];
if(nx>=0&&ny>=0&&nx<n&&ny<m&&c[nx][ny]!='.'&&vis[nx][ny]==0){
tempt.first=nx,tempt.second=ny;
que.push(tempt);
vis[nx][ny]=1;
}
}
}
}
int main()
{
while(scanf("%d %d",&n,&m)!=EOF){
getchar();
int F=0;
countaa=0;
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i+=1){
for(int j=0;j<m;j+=1){
scanf("%c",&c[i][j]);
}
getchar();
}
for(int i=0;i<n;i+=1){
bool flag=0;
for(int j=0;j<m;j+=1){
// printf("(%d,%d)",i+1,j+1);
if(!vis[i][j]&&c[i][j]=='#'){
u=d=i;
r=l=j;
counta=0;
bfs(i,j);
if(counta!=(u-d+1)*(r-l+1)){
F=1;
//printf("hhhhh(u%d-d%d+1)*(r%d-l%d+1)=%d counta=%d\n",u,d,r,l,(u-d+1)*(r-l+1),counta);
break;
}
else{
countaa+=1;
}
}
//printf("dfasfd%d %d\n",i+1,j+1);
}
if(F){
// printf("\n\ncome and eat shit\n\n");
break;
}
}
if(F){
printf("So Sad\n");
}
else{
printf("There are %d ships.\n",countaa);
}
}
return 0;
}