矩形排列的巧解
首先:
给定N个矩形,每个矩形宽W米高H米
请按以下规则将这N个矩形排序,输出排序后的矩形列表
排序规则:
面积小的矩形排在面积大的矩形前面
面积相同的矩形,按照宽高比排序,宽高比大的矩形排在宽高比小的矩形前面
宽高比的定义为 min(W/H, H/W)
面积和宽高比都相同的矩形,按照宽排序,宽度更小的矩形排在宽度更大的矩形前面
我们先进行输入:
int main()
{
int N;
cin >> N; //输入矩形个数
int Ns = N;//记录个数
vector<int>v; //创建一个矩形用于存放宽和高
int w, h; //宽 高
while (N--) //一次输入并存放
{
cin >> w;
cin >> h;
v.push_back(w);
v.push_back(h);
}
Than(v, Ns);//处理和比较
}
接下来就可以定义比较和处理函数了:
void Than(vector<int>v,int n)
{
int max = 0; //假设最大的面积为0
for (int i = 0; i < 2 * n; i=i+2)
{
if (v[i] * v[i + 1] > max) // 宽和高相乘与最大面积相比
{
max = v[i] * v[i + 1]; //最大面积更改
}
else if (v[i] * v[i + 1] == max) //出现面积相等情况
{
int temp=min(v[i] / v[i + 1], v[i + 1] / v[i]); //求当前矩形的宽高比
int temp1 = min(v[i - 2] / v[i - 1], v[i - 1] / v[i - 2]);//求出面积相等矩形的宽高比
if (temp > temp1) //如果当前的较大则交换
{
int w = v[i - 2];
int h = v[i - 1];
v[i - 2] = v[i];
v[i] = w;
v[i - 1] = v[i + 1];
v[i + 1] = h;
i = -2; //重新回到开头
max = 0;
}
else if(temp==temp1) //宽高比相等
{
if (v[i] < v[i - 2]) //宽小的交换
{
int w = v[i - 2];
int h = v[i - 1];
v[i - 2] = v[i];
v[i] = w;
v[i - 1] = v[i + 1];
v[i + 1] = h;
i = -2;
max = 0;
}
else
continue;
}
}
else //面积不相等 ,进行交换,小的换到最前面
{
int w = v[i];
int h = v[i +1];
v[i] = v[i-2];
v[i - 2] = w;
v[i + 1] = v[i -1];
v[i - 1] = h;
i = -2;
max = 0;
}
}
处理完接下来就是输出啦
只需在Than()函数中加入输出就完成咯
cout << "输出结果如下:" << endl;
cout << "宽高序列:" << endl;
for (vector<int>::iterator it = v.begin(); it < v.end(); it++) //输出矩形宽高序列
{
cout << *it<<" ";
}
cout << endl;
cout << "面积序列:" << endl;
for (vector<int>::iterator it = v.begin(); it < v.end(); it+=2) //输出矩形面积序列
{
cout << *it*(*(it+1)) << " ";
}
cout << endl;
}
赶快验证结果
最后以上代码可能不是很完美,请多多关照。