洛谷P1331海战

洛谷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!

猜你喜欢

转载自blog.csdn.net/weixin_50624971/article/details/113372277