如何高效找出批量随机生成矩形中的最大面积(以50个为例)
批量生成矩形并找出最大面积的解决方案
你已经实现了生成3个随机矩形并找出最大面积的功能,但面对50个矩形时,完全不需要写大量if语句,用遍历跟踪最大值或者数组存储后遍历的方法就能轻松解决。
核心思路
不需要逐个写条件判断,只需要在生成每个矩形时,维护当前找到的最大面积和对应的矩形编号(或矩形信息),每生成一个就和当前最大值对比更新即可。
修改后的代码实现
我们可以调整genRec函数让它返回生成的矩形,同时在主函数里跟踪最大值:
#include <stdio.h> #include <time.h> struct Point { int x; int y; }; struct Rectangle { struct Point topLeft; struct Point botRight; }; // 计算矩形面积 int Area(struct Rectangle r) { int length = r.botRight.x - r.topLeft.x; int breadth = r.topLeft.y - r.botRight.y; return length * breadth; } // 生成一个符合要求的矩形并返回 struct Rectangle genRec() { struct Rectangle rec; // 生成初始坐标点 rec.topLeft.x = -50 + rand() % 101; rec.topLeft.y = -50 + rand() % 101; rec.botRight.x = -50 + rand() % 101; rec.botRight.y = -50 + rand() % 101; // 确保右下角x坐标大于左上角x坐标 while (rec.botRight.x <= rec.topLeft.x) { rec.botRight.x = -50 + rand() % 101; } // 确保左上角y坐标大于右下角y坐标 while (rec.topLeft.y <= rec.botRight.y) { rec.topLeft.y = -50 + rand() % 101; } return rec; } int main() { srand(time(NULL)); const int COUNT = 50; // 记录最大面积、对应的矩形编号和矩形信息 int maxArea = -1; int maxIndex = -1; struct Rectangle maxRect; for (int i = 1; i <= COUNT; i++) { struct Rectangle current = genRec(); int currentArea = Area(current); // 输出当前矩形信息 printf("\t----------RECTANGLE %d----------\n", i); printf("\tTop left point is x = %d y = %d\n", current.topLeft.x, current.topLeft.y); printf("\tBottom right point is x = %d y = %d\n", current.botRight.x, current.botRight.y); printf("\tArea is %d\n", currentArea); // 对比更新最大值 if (currentArea > maxArea) { maxArea = currentArea; maxIndex = i; maxRect = current; } } // 输出最终结果 printf("\n\t===============================\n"); printf("\tRectangle %d has the biggest area --> %d\n", maxIndex, maxArea); printf("\tTop left: x=%d y=%d, Bottom right: x=%d y=%d\n", maxRect.topLeft.x, maxRect.topLeft.y, maxRect.botRight.x, maxRect.botRight.y); printf("\t===============================\n"); return 0; }
代码说明
- 调整
genRec函数:让它返回生成的struct Rectangle,而不是在函数内直接输出,这样主函数可以获取每个矩形的信息进行后续处理。 - 跟踪最大值:在主函数里初始化
maxArea(初始设为-1,因为所有矩形面积都是正数)、maxIndex(记录最大面积矩形的编号)、maxRect(保存最大矩形的坐标信息)。 - 循环对比更新:每生成一个矩形,计算面积后和当前
maxArea比较,如果更大就更新最大值相关变量。 - 最终输出:循环结束后直接输出最大面积的矩形信息,全程不需要大量if语句。
如果需要保存所有矩形(比如后续还要做其他处理),可以用数组存储:
// 在main函数里定义数组 struct Rectangle rects[50]; // 循环生成时存入数组 rects[i-1] = genRec(); // 后续遍历数组找最大值 int maxArea = -1; int maxIdx = 0; for (int j=0; j<50; j++){ int area = Area(rects[j]); if(area > maxArea){ maxArea = area; maxIdx = j+1; // 对应第几个矩形 } }
内容的提问来源于stack exchange,提问作者dan1chX
相关产品推荐
相关产品推荐

