POJ - 3347 Kadj Squares

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lidengdengter/article/details/82110989

题目链接

每个方形45度放置,贴边放置,尽可能减省空间,问最后从上往下看能看到哪几个方形。

定义结构体,记录方形的边长,左顶点位置和右顶点位置,因为有覆盖,所以更新左右顶点位置,再判断即可。

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=55;

struct square{
	int lp; //左位置 
	int rp; //右位置 
	int len; //边长 
}p[N]; 

int ans[N],n;
void work(){
	for(int i=1;i<=n;i++){
		for(int j=1;j<i;j++)  //覆盖方形左侧,更新左位置,如3 
			if(p[i].lp<p[j].rp&&p[i].len<p[j].len)
				p[i].lp=p[j].rp;
		for(int j=i+1;j<=n;j++) //覆盖方形右侧,更新右位置,如1 
			if(p[i].rp>p[j].lp&&p[j].len>p[i].len)
				p[i].rp=p[j].lp; 
	}
	
	int cnt=0;
	memset(ans,0,sizeof(ans));
	for(int i=1;i<=n;i++)
		if(p[i].lp<p[i].rp)
			ans[cnt++]=i;
	
	for(int i=0;i<cnt;i++)
		printf("%d%c",ans[i],i==cnt-1?'\n':' ');
}

int main(){
	while(~scanf("%d",&n),n){
		for(int i=1;i<=n;i++){
			scanf("%d",&p[i].len);
			p[i].lp=0;
			for(int j=1;j<i;j++) //更新左位置 
				p[i].lp=max(p[i].lp,p[j].rp-abs(p[i].len-p[j].len)); 
			p[i].rp=p[i].lp+2*p[i].len; //因为45度放置,都乘以sqrt(2)便于计算 
		}
		work();
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/lidengdengter/article/details/82110989