【枚举】Big Square

问题 2:Big Square(bigsq.pas)

 

农民 John 的牛参加了一次和农民 Bob 的牛的竞赛。他们在区域中画了一个N*N(2 <= N <=100)的正方形点阵,两个农场的牛各自占据了一些点。当然不能有两头牛处于同一个点。农场的目标是用自己的牛作为4个顶点,形成一个面积最大的正方形(不必须和边界平行) 。

除了John 的一头牛Bessie以外,John其他的牛都已经放到点阵中去了,要确定Bessie放在哪个位置,能使得农民John的农场得到一个最大的正方形(Bessie不是必须参与作为正方形的四个顶点之一)。

 

输入格式:

Line 1: 一个整数 N

Lines 2..N+1: 第 i+1 行描述点阵的第i行,有 N 个字符。字符集是:

'J' 表示这个点是农民 John 的牛, 'B'表示这个点是农民 Bob 的牛,

'*' 表示这个点没有被占据。保证至少有一个点没有被占据。

 

输入样例 (文件名bigsq.in):

6

J*J***

******

J***J*

******

**B***

******

 

输出格式:Line 1: 最大正方形的面积,或者无解的话输出0。

 

输出样例 (文件名bigsq.out):

4

 

输出解释:

如果 Bessie 可以占据 农民 Bob 的牛所占的点,那么可以生成一个面积为8的正方形,但是她只能放到第3行第3列,形成一个最大的、面积为 4个正方形。


枚举两个点确定一条线段作为边,再用向量旋转的方法,求出另外两个点(注意有两组解,当时忘了另外一组,所以错了一半。)

另外还可以确定一条线段作为对角线,求另外两个点(这样就只有唯一的解。但是听说有精度误差。)


可以参考一个这个:

所以说对于p = (x,y)这个向量向逆时针旋转且大小不改变所得到的向量如下:

p: (x,y) --------> p': ( x*cos(d)-y*sin(d) , x*sin(d)+y*cos(d) )


如果是向顺时针旋转则:

p: (x,y) --------> p': ( x*cos(-d)-y*sin(-d) , x*sin(-d)+y*cos(-d) )



注意类中传参,能用传址就传址,会快得多。

#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
using std::max;
char map[120][120];
long cnt = 0;
long ans = 0;
long n;

inline long getint()
{
	long rs=0;bool sgn=1;char tmp;
	do tmp = getchar();
	while (!isdigit(tmp)&&tmp!='-');
	if (tmp=='-'){tmp=getchar();sgn=0;}
	do rs=(rs<<3)+(rs<<1)+tmp-'0';
	while (isdigit(tmp=getchar()));
	return sgn?rs:-rs;
}

struct node
{
	long x;
	long y;
	node(){}
	node(long _x,long _y):x(_x),y(_y){}
	node(const node& n2):x(n2.x),y(n2.y){}
	node operator-(node& n2)
	{
		return node(x-n2.x,y-n2.y);
	}
	node operator+(node& n2)
	{
		return node(x+n2.x,y+n2.y);
	}
	long operator*(node& n2)
	{
		return x*n2.x+y*n2.y;
	}
};
node pos[10010];

#define outofrange(a) (a.x<1||a.y<1||a.x>n||a.y>n)

/*
inline bool outofrange(node& a)
{
	return a.x<1||a.y<1||a.x>n||a.y>n;
}*/

inline void turn(node& n1,node& n2,node& n3,char dir)
{
	node tmp = n2-n1;
	n3.y = tmp.x;
	n3.x = tmp.y;
	if (dir)
	{
		if (tmp.x > 0 && tmp.y > 0)
			n3.x = -n3.x;
		else if (tmp.x > 0 && tmp.y < 0)
			n3.y = -n3.y;
		else if (tmp.x < 0 && tmp.y < 0)
			n3.x = -n3.x;
		else if (tmp.x < 0 && tmp.y > 0)
			n3.y = -n3.y;
		else if (tmp.x == 0)
			n3.x = -n3.x;
		else if (tmp.y == 0)
			n3.y = n3.y;
	}
	else
	{
		if (tmp.x > 0 && tmp.y > 0)
			n3.y = -n3.y;
		else if (tmp.x > 0 && tmp.y < 0)
			n3.x = -n3.x;
		else if (tmp.x < 0 && tmp.y < 0)
			n3.y = -n3.y;
		else if (tmp.x < 0 && tmp.y > 0)
			n3.x = -n3.x;
		else if (tmp.x == 0)
			n3.x = n3.x;
		else if (tmp.y == 0)
			n3.y = -n3.y;
	}
	n3 = n3 + n1;
}

node tn; node fn;

int main()
{
	freopen("bigsq.in","r",stdin);
	freopen("bigsq.out","w",stdout);

	n = getint();
	for (long i=1;i<n+1;i++)
	{
		for (long j=1;j<n+1;j++)
		{
			do map[i][j]=getchar();
			while (map[i][j]!='J'&&map[i][j]!='*'&&map[i][j]!='B');
			if (map[i][j] == 'J')
			{
				++cnt;
				pos[cnt].x = i;
				pos[cnt].y = j;
			}
		}
	}

	for (long i=1;i<cnt+1;i++)
	{
		for (long j=i+1;j<cnt+1;j++)
		{
			tn = (pos[i]-pos[j]);
			long square = tn.x*tn.x+tn.y*tn.y;
			if (square <= ans)
				continue;

			turn(pos[j],pos[i],tn,0);
			turn(pos[i],pos[j],fn,1);

			if (map[tn.x][tn.y]!='B' && map[fn.x][fn.y]!='B' && (map[tn.x][tn.y]=='J'||map[fn.x][fn.y]=='J') && !outofrange(tn) && !outofrange(fn))
			{
				ans = max(ans,square);
				//printf("a%ld(%ld,%ld),%ld(%ld,%ld),(%ld,%ld),(%ld,%ld),ans:%ld\n",i,pos[i].x,pos[i].y,j,pos[j].x,pos[j].y,tn.x,tn.y,fn.x,fn.y,ans);
			}

			turn(pos[j],pos[i],tn,1);
			turn(pos[i],pos[j],fn,0);

			if (map[tn.x][tn.y]!='B' && map[fn.x][fn.y]!='B' && (map[tn.x][tn.y]=='J'||map[fn.x][fn.y]=='J') && !outofrange(tn) && !outofrange(fn))
			{
				ans = max(ans,square);
				//printf("b%ld(%ld,%ld),%ld(%ld,%ld),(%ld,%ld),(%ld,%ld),ans:%ld\n",i,pos[i].x,pos[i].y,j,pos[j].x,pos[j].y,tn.x,tn.y,fn.x,fn.y,ans);
			}
		}
	}
	printf("%ld",ans);

	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
城市应急指挥系统是智慧城市建设的重要组成部分,旨在提高城市对突发事件的预防和处置能力。系统背景源于自然灾害和事故灾难频发,如汶川地震和日本大地震等,这些事件造成了巨大的人员伤亡和财产损失。随着城市化进程的加快,应急信息化建设面临信息资源分散、管理标准不统一等问题,需要通过统筹管理和技术创新来解决。 系统的设计思路是通过先进的技术手段,如物联网、射频识别、卫星定位等,构建一个具有强大信息感知和通信能力的网络和平台。这将促进不同部门和层次之间的信息共享、交流和整合,提高城市资源的利用效率,满足城市对各种信息的获取和使用需求。在“十二五”期间,应急信息化工作将依托这些技术,实现动态监控、风险管理、预警以及统一指挥调度。 应急指挥系统的建设目标是实现快速有效的应对各种突发事件,保障人民生命财产安全,减少社会危害和经济损失。系统将包括预测预警、模拟演练、辅助决策、态势分析等功能,以及应急值守、预案管理、GIS应用等基本应用。此外,还包括支撑平台的建设,如接警中心、视频会议、统一通信等基础设施。 系统的实施将涉及到应急网络建设、应急指挥、视频监控、卫星通信等多个方面。通过高度集成的系统,建立统一的信息接收和处理平台,实现多渠道接入和融合指挥调度。此外,还包括应急指挥中心基础平台建设、固定和移动应急指挥通信系统建设,以及应急队伍建设,确保能够迅速响应并有效处置各类突发事件。 项目的意义在于,它不仅是提升灾害监测预报水平和预警能力的重要科技支撑,也是实现预防和减轻重大灾害和事故损失的关键。通过实施城市应急指挥系统,可以加强社会管理和公共服务,构建和谐社会,为打造平安城市提供坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值