洛谷P1331海战
题目传送门
这道题的难点在于判断是否有船相邻。
通过自己模拟的数据可以得出结论:
如果图是不和法的,一定存在如下结构:
# #
. #
或
# #
# .
或
# .
# #
或
. #
# #
即在一个2*2的方格中有三个#。
因为题里说船是方形的,即只能是横条或竖条
刚开始不审题爆掉了37分
于是就有判断:
bool d(int i,int j)
{
int c=0;
if(a[i][j]=='#')
{
c++;
}
if(a[i+1][j]=='#')
{
c++;
}
if(a[i][j+1]=='#')
{
c++;
}
if(a[i+1][j+1]=='#')
{
c++;
}
if(c==3)
{
return 0;
}
return 1;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(i<n&&j<m&&d(i,j)==0)
{
printf("Bad placement.");
return 0;
}
}
}
在加上一个bfs就是完整代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,ans=0,h[10000001][3];
char a[1001][1001];
int dx[8]={
-1,1,0,0,-1,-1,1,1};
int dy[8]={
0,0,-1,1,-1,1,-1,1};
void js(int p,int q)
{
int xx,yy,t=0,w=1;
ans++;
h[1][1]=p;
h[1][2]=q;
a[p][q]='.';
do
{
t++;
for(int i=0;i<8;i++)
{
xx=h[t][1]+dx[i];
yy=h[t][2]+dy[i];
if(xx>0&&xx<=n&&yy>0&&yy<=m&&a[xx][yy]=='#')
{
a[xx][yy]='.';
w++;
h[w][1]=xx;
h[w][2]=yy;
}
}
}while(t<w);
}
bool d(int i,int j)
{
int c=0;
if(a[i][j]=='#')
{
c++;
}
if(a[i+1][j]=='#')
{
c++;
}
if(a[i][j+1]=='#')
{
c++;
}
if(a[i+1][j+1]=='#')
{
c++;
}
if(c==3)
{
return 0;
}
return 1;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(i<n&&j<m&&d(i,j)==0)
{
printf("Bad placement.");
return 0;
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i][j]=='#')
{
js(i,j);
}
}
}
printf("There are %d ships.\n",ans);
return 0;
}
大功告成,完美AC!