题意是这样,一个海面上有N条船,用长方形表示。海域中#代表有船的格子,.代表没船的格子。统计共有多少条船。
如果两条船有接触的话(包括顶点接触),则判为不合法。
说下判断不合法的情况如何判断吧。
DFS或者BFS求联通分量的时候,维护左上角坐标(r1,c1)和右下角坐标(r2,c2),再统计出联通分量中的网格数num。如果(r2-r1+1)*(c2-c1+1)!=num,就不合法。
开始我没注意不能够顶角相连,所以在算联通分量的时候仅仅向(r-1,c) (r+1,c) (r,c-1) (r,c+1)转移,事实上还要向(r-1,c-1) (r+1,c+1) (r-1,c+1) (r+1,c-1)转移。细心啊细心,regional被这种题粉掉就要撞墙了
贴代码
1
# include <iostream>
2
# include <cstring>
3
# include <cstdio>
4
# include <queue>
5
using namespace std;
6
bool used[1200000];
7
char map[1001][1002];
8
# define encode(a,b) (((a)<<10)|(b))
9
queue<int> q;
10
int main()
11

{
12
int r,c,i,j;
13
while(true)
14
{
15
scanf("%d%d",&r,&c);
16
if(!r&&!c) break;
17
for(i=0;i<r;i++)
18
scanf("%s",map[i]);
19
int res=0;
20
bool flag=true;
21
memset(used,0,sizeof(used));
22
for(i=0;i<r&&flag;i++)
23
for(j=0;j<c&&flag;j++)
24
if(map[i][j]=='#')
25
{
26
int r1=0xfffffff,c1=0xfffffff,r2=-1,c2=-1,num=0;
27
while(!q.empty()) q.pop();
28
q.push(encode(i,j));
29
used[encode(i,j)]=true;
30
while(!q.empty())
31
{
32
int tr=q.front()>>10,tc=q.front()&1023;
33
q.pop();
34
num++;
35
map[tr][tc]='.';
36
if(tr<r1||tr==r1&&tc<c1) r1=tr,c1=tc;
37
if(tr>r2||tr==r2&&tc>c2) r2=tr,c2=tc;
38
if(tr+1<r&&map[tr+1][tc]=='#'&&!used[encode(tr+1,tc)])
39
{
40
q.push(encode(tr+1,tc));
41
used[encode(tr+1,tc)]=true;
42
}
43
if(tr-1>=0&&map[tr-1][tc]=='#'&&!used[encode(tr-1,tc)])
44
{
45
q.push(encode(tr-1,tc));
46
used[encode(tr-1,tc)]=true;
47
}
48
if(tc+1<c&&map[tr][tc+1]=='#'&&!used[encode(tr,tc+1)])
49
{
50
q.push(encode(tr,tc+1));
51
used[encode(tr,tc+1)]=true;
52
}
53
if(tc-1>=0&&map[tr][tc-1]=='#'&&!used[encode(tr,tc-1)])
54
{
55
q.push(encode(tr,tc-1));
56
used[encode(tr,tc-1)]=true;
57
}
58
if(tc-1>=0&&tr-1>=0&&map[tr-1][tc-1]=='#'&&!used[encode(tr-1,tc-1)])
59
{
60
q.push(encode(tr-1,tc-1));
61
used[encode(tr-1,tc-1)]=true;
62
}
63
if(tc-1>=0&&tr+1<r&&map[tr+1][tc-1]=='#'&&!used[encode(tr+1,tc-1)])
64
{
65
q.push(encode(tr+1,tc-1));
66
used[encode(tr+1,tc-1)]=true;
67
}
68
if(tc+1<c&&tr-1>=0&&map[tr-1][tc+1]=='#'&&!used[encode(tr-1,tc+1)])
69
{
70
q.push(encode(tr-1,tc+1));
71
used[encode(tr-1,tc+1)]=true;
72
}
73
if(tc+1<c&&tr+1<r&&map[tr+1][tc+1]=='#'&&!used[encode(tr+1,tc+1)])
74
{
75
q.push(encode(tr+1,tc+1));
76
used[encode(tr+1,tc+1)]=true;
77
}
78
}
79
if((r2-r1+1)*(c2-c1+1)!=num) flag=false;
80
else res++;
81
}
82
if(flag) printf("There are %d ships.\n",res);
83
else printf("Bad placement.\n");
84
}
85
return 0;
86
}
87
88