【模拟】正方形

这篇博客详细介绍了如何模拟正方形的问题,包括题目描述、输入和输出格式的定义,以及具体的样例输入和输出。博主通过注释和分析环节,深入探讨了问题解决的思路,并给出了相应的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

有n个大小不一的正方形,现将它们依次以45度斜放入第一象限,每个正方形都要与x轴有一个交点,且不能与之前放入的正方形重叠。在此前提下,正方形与x轴交点的坐标应尽可能小。问这样放置后,从上往下看,至少能部分被看见的正方形有哪些?

输入格式

每个测试点包含多组测试数据。每个测试数据的第一行是一个整数n,第二行是n个正整数,表示每个正方形的变长。输入以一行单独的0结束。

输出格式

对于每个测试数据输出一行,增序输出至少可看到部分的正方形的编号,用空格隔开。

样例输入 


3 5 1 4 

2 1 2 
0

样例输出 

1 2 4 
1 3

注释


对于50%的数据,n<=10 ; 
对于100%的数据,n<=50 正方形的大小不超过30。

分析

模拟放的过程,最后计算时,枚举寻找右边矩形左端点的最大值和左边矩形右端点的最小值,如果右边盖住左边,则被遮挡。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,s[51],a[51];
int main()
{   freopen("square.in","r",stdin);
	freopen("square.out","w",stdout);
	cin>>n;
    while (n!=0)
    {
        memset(s,0,sizeof(a));
        memset(a,0,sizeof(a));
	   cin>>a[1];
	   s[1]=a[1];
	 for (int i=2;i<=n;i++)
	 {
	 	cin>>a[i];
	    s[i]=s[i-1]+2*min(a[i],a[i-1]);
		for (int j=i-2;j>=1;j--)
		 {
		 	if (s[i]-2*a[i] < s[j]) 
			  if (s[j]+2*a[j] > s[i])
			s[i]=max(s[j]+2*min(a[j],a[i]),a[i]); 
		 }
	 }
	for (int i=1;i<=n;i++)
	 {
	 	int le=s[n]+a[n],ri=0;
	 	for (int j=1;j<i;j++) ri=max(ri,s[j]+a[j]); 
	 	for (int j=i+1;j<=n;j++)  le=min(le,s[j]-a[j]);
	    if (le>ri) cout<<i<<" ";
	 }
	 cin>>n;
	 cout<<endl;
    }
	return 0;
}



### 使用 `scatter` 函数绘制正方形 为了使用 MATLAB 的 `scatter` 函数绘制一个正方形,可以通过定义四个顶坐标来表示正方形的角位置。具体方法是在二维平面上设定这四个的位置,通过适当参数调整散图样式使其看起来像连接成一个封闭图形。 下面是一个简单的例子展示如何利用 `scatter` 来模拟正方形: ```matlab % 定义正方形边长的一半以及中心位置 (这里假设为原) side_length_half = 1; center_x = 0; center_y = 0; % 计算四个角落坐标的偏移量 offsets = side_length_half * [-1, -1; 1, -1; 1, 1; -1, 1]; % 获取实际坐标值 square_coords = offsets + repmat([center_x, center_y], size(offsets, 1), 1); % 提取x,y坐标分量 x = square_coords(:, 1); y = square_coords(:, 2); % 调用 scatter 函数绘图 figure(); % 创建新的图形窗口[^4] hold on; % 启动保持模式以便后续添加线条 scatter(x, y, 'filled'); % 绘制填充样式的散 for i = 1:length(x)-1 plot([x(i), x(i+1)], [y(i), y(i+1)]); % 连接相邻两形成边框 end plot([x(end), x(1)], [y(end), y(1)]); % 关闭路径回到起 axis equal; % 设置相同的比例尺使得显示正常 title('Square drawn using scatter function'); xlabel('X-axis'); ylabel('Y-axis'); grid on; ``` 这段代码首先计算出了组成正方形所需的四个顶坐标,接着调用了 `scatter()` 函数以这些为中心绘制了标记。为了让这个图形更接近于真正的几何形状——即具有明显的边界线——额外加入了几个 `plot()` 命令用来依次连接各个顶从而构建出完整的轮廓。最后设置了相同的纵横比例(`axis equal`)确保最终呈现出来的确实是标准的正方形而不是菱形或其他变形后的多边形[^1]。 #### 注意事项 - 此处虽然主要依赖的是 `scatter` 函数来进行可视化操作,但是为了能够清晰地看到正方形结构还是借助了一定量的辅助手段比如连线处理。 - 如果只需要简单地标记而不关心具体的外形,则可以直接省去所有的 `plot` 部分只保留最基础的 `scatter` 调用即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值