最小长方形

给定一组2D平面上的整数坐标点,任务是找到一个最小的长方形,其边平行于坐标轴,能完全覆盖所有点。输入包含多个测试用例,每个用例以(0, 0)坐标结束。输出为每个测试用例的长方形左下角和右上角坐标,对于只包含一个点或一条直线的情况则不作输出。" 13018147,1299203,C# Datagridview 英文数字输入限制,"['C#开发', '数据控件', '用户输入']

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

题目:

给定一系列2维平面点的坐标(x, y),其中x和y均为整数,要求用一个最小的长方形框将所有点框在内。长方形框的边分别平行于x和y坐标轴,点落在边上也算是被框在内。

输入:

测试输入包含若干测试用例,每个测试用例由一系列坐标组成,每对坐标(x y) 占一行,其中|x|和|y|小于 1000;一对(0,0) 坐标标志着一个测试用例的结束。注意(0, 0)不作为任何一个测试用例里面的点。一个没有点的测试用例标志着整个输入的结束。

输出:

对每个测试用例,在1行内输出2对整数,其间用一个空格隔开。第1对整数是长方形框左下角的坐标,第2对整数是长方形框右上角的坐标。

如果只是一个点或者一条线,不输出。例如:

12 34
0 0
只是一个点,不是长方形,不输出。

样例:

输入:

12 56
23 56
13 10
0 0
12 34
0 0
0 0
输出:

12 10 23 56
代码:
#include <iostream>
#include <vector>
#include <utility>
using namespace std;
int main()
{
	vector<vector<pair<int, int>>> input;//保存输入所有数据
	vector<pair<int, int>> input_mem;//保存输入每组顶点数据
	pair<int, int> input_line;//保存输入每组数据中的每个点坐标
	pair<int, int> zero_line(0, 0);//保存每组数据输入结束符
	vector<pair<int, int>> zero_mem;//保存所有数据输入结束符
	zero_mem.push_back(zero_line);
	while (1)
	{
		while (1)
		{
			cin >> input_line.first >> input_line.second;//输入一个顶点坐标
			if (input_line == zero_line)//如果输入的为这组数据的结束符,则终止循环,代表本组数据输入结束
			{
				input_mem.push_back(input_line);//将结束符(0,0)存入本组数据
				break;//本组数据输入结束
			}
			else
				input_mem.push_back(input_line);//正常输入顶点数据
		}
		if (input_mem == zero_mem)//如果所有顶点组数据都输入完毕,则终止输入
			break;
		input.push_back(input_mem);//正常输入顶点组数据
		input_mem.clear();//清空存顶点组数据的中间变量,为下一组数据输入做好准备
	}
	for (int i = 0; i<input.size(); i++)//对所有输入的顶点组数据
	{
		if (input[i].size() == 2)//如果当前组只要两个数据,说明只有一个顶点,不输出
			continue;
		int min_x = input[i][0].first;//保存最小、最大顶点数值
		int max_x = input[i][0].first;
		int min_y = input[i][0].second;
		int max_y = input[i][0].second;
		for (int j = 1; j<input[i].size() - 1; j++)//比较当前顶点与最大、最小顶点数值
		{

			if (input[i][j].first<min_x)//跟新最大、最小顶点数值
			{
				min_x = input[i][j].first;
			}
			if (input[i][j].first>max_x)
			{
				max_x = input[i][j].first;
			}
			if (input[i][j].second<min_y)
			{
				min_y = input[i][j].second;
			}
			if (input[i][j].second>max_y)
			{
				max_y = input[i][j].second;
			}
		}
		cout << min_x << " " << min_y << " " << max_x << " " << max_y << endl;//每组输出一行
	}
	return 0;
}<strong>
</strong>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值