bfs,91分,第6个点mle
  • 板块P1331 海战
  • 楼主henkgaz
  • 当前回复3
  • 已保存回复3
  • 发布时间2020/10/12 21:41
  • 上次更新2023/11/5 10:53:47
查看原帖
bfs,91分,第6个点mle
115322
henkgaz楼主2020/10/12 21:41

问题如标题

请dalao不要吐槽我什么都不说直接贴代码,请相信本蒟蒻已经尽力了,实在找不到什么能再优化的点了

本来想用这道题练bfs,结果一直调到电脑没电,现在用最后一点电量写这个求助帖,如果dalao们发现我没有回应那就代表本蒟蒻的电脑已经死了

#include<bits/stdc++.h>
using namespace std;
struct node{
	int x,y;
};
int R,C;
bool m[1010][1010];
//邪教优化,用bool存图省空间(然而还是没过) 
int dx[5]={0,1,0,-1,0};
int dy[5]={0,0,1,0,-1};
queue<node>q;
int main()
{
	int ans=0;
	char a;
	memset(m,0,sizeof(m));
	cin>>R>>C;
	for(int i=1;i<=R;i++)
	    for(int j=1;j<=C;j++)
	    {
	    	cin>>a;
	    	if(a=='.')
	    	    m[i][j]=0;
	    	else m[i][j]=1;
//#标记为1,.标记为0 
		}
	int cnt;
	for(int i=1;i<R;i++)
	    for(register int j=1;j<C;j++)
	    {
	    	cnt=0;
	    	if(m[i][j]==1) cnt++;
	    	if(m[i+1][j]==1) cnt++;
	    	if(m[i][j+1]==1) cnt++;
	    	if(m[i+1][j+1]==1) cnt++;
	    	if(cnt==3)
	    	{
	    		cout<<"Bad placement.";
	    		return 0;
			}
		}
//判矩形 
	node p;
	int r,c;
	for(int i=1;i<=R;i++)
	    for(int j=1;j<=C;j++)
	    {
	    	if(!m[i][j])
	    	    continue;
	    	ans++;
	    	q.push((node){i,j});
	    	while(!q.empty())
	    	{
	    		p=q.front();
	    		q.pop();
	    		r=p.x,c=p.y;
	    		m[r][c]=0;
	    		for(int i=1;i<=2;i++)
	    		{
	    			if(!m[r+dx[i]][c+dy[i]])
	    			    continue;
					q.push((node){r+dx[i],c+dy[i]});
				}
//只搜右下两个方向,因为向左上往回搜的一定不是矩形,已经被排除 
			}
		}
	printf("There are %d ships.",ans);
}
2020/10/12 21:41
加载中...