P1950 长方形

本文介绍了一个在洛谷网站上的编程挑战,涉及使用C++实现动态规划求解长方形中点数的问题,代码展示了如何计算给定矩阵中非边界点的数量。作者寻求帮助解决在洛谷平台上代码无法通过的问题。

题目:

P1950 长方形 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

 

 算法:

dp动态规划

代码:

#include<iostream>
#include<string>
typedef unsigned long long ull;
const int N = 1010;
using namespace std;
 int r, c, i, j;
ull h[N][N], w[N][N];
int main()
{
	cin >> r >> c;
	string s;
	ull count = 0,sum=0;
	for (i = 1; i <= r; i++){
		cin >> s;
		for (j = 0; j < c; j++) {
			if (s[j] == '.') {
				h[i][j+1] = h[i - 1][j+1] + 1;
				w[i][j + 1] = w[i][j] + 1;
				sum += h[i][j + 1] + w[i][j + 1];
				count++;
			}
		}	
	}
	cout << sum - count;
}
//(自己编译器上能过,洛谷上一个都过不了。。。哪个大佬救救我啊啊啊)

### 使用OpenCV进行长方形形状检测 为了实现长方形的检测,可以采用边缘检测和轮廓查找相结合的方式。具体过程涉及图像预处理、边缘检测以及通过几何特征筛选符合条件的矩形轮廓。 #### 图像预处理 读取输入图像并将其转换为灰度图,以便后续操作更加高效: ```python import cv2 import numpy as np def preprocess_image(image_path): image = cv2.imread(image_path) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) blurred = cv2.GaussianBlur(gray, (5, 5), 0) # 高斯模糊减少噪声影响 edged = cv2.Canny(blurred, 50, 150) # Canny算子提取边缘 return image, edged ``` #### 轮廓查找与过滤 通过对二值化后的边缘图像寻找外部轮廓,并从中挑选出近似四边形的对象作为候选长方形: ```python def find_rectangles(edged_img): contours, _ = cv2.findContours(edged_img.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) rectangles = [] for contour in contours: peri = cv2.arcLength(contour, True) approx = cv2.approxPolyDP(contour, 0.02 * peri, True) if len(approx) == 4: # 只保留四个顶点的多边形 rect = cv2.minAreaRect(contour) box = cv2.boxPoints(rect) boxes = np.intp(box) w = abs(boxes[0][0] - boxes[1][0]) h = abs(boxes[0][1] - boxes[3][1]) aspect_ratio = max(w,h)/min(w,h) area = w*h if aspect_ratio >= 1 and area > 1000: # 过滤掉过小或比例不合适的对象 rectangles.append((rect, boxes)) return rectangles ``` 上述代码片段中定义了一个`find_rectangles()`函数用于定位可能存在的矩形容器[^2]。这里设置了一些条件来排除那些不符合实际需求的小尺寸或者非标准比例的目标物体。 #### 结果可视化 最后一步是在原始彩色图片中标记找到的所有矩形框及其位置信息: ```python def draw_results(original_img, rects): result_img = original_img.copy() for _, box in rects: cv2.drawContours(result_img,[box],0,(0,255,0),2) return result_img ``` 完整的流程可以通过调用这些辅助方法完成整个长方形检测的任务。需要注意的是,在不同版本之间可能存在API差异,因此当遇到兼容性问题时应查阅官方文档获取最新接口说明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hz2.0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值