
本文介绍一种健壮的 JavaScript 算法,用于从由 +, -, | 和空格组成的多行 ASCII 图形中识别并提取所有基本矩形结构,通过坐标扫描与边界验证相结合,确保仅返回语义完整、边界合规的矩形。
本文介绍一种健壮的 javascript 算法,用于从由 `+`, `-`, `|` 和空格组成的多行 ascii 图形中识别并提取所有基本矩形结构,通过坐标扫描与边界验证相结合,确保仅返回语义完整、边界合规的矩形。
在处理 ASCII 艺术图形时,一个常见但具挑战性的任务是将复合图形“分解”为其构成的基本矩形——即那些由 +(角点)、-(水平边)、|(垂直边)围成的闭合区域。原始实现试图通过暴力枚举所有 + 组合并直接裁剪来提取矩形,但存在严重缺陷:未验证边框完整性、错误修改原图导致后续匹配失效、且未排除嵌套或重叠干扰。
正确的解法应遵循“检测 → 验证 → 构建”三步范式:
✅ 核心思路:几何约束 + 语义验证
- 定位候选左上角:遍历每一行,找到字符为 + 的位置 (x, y);
- 搜索右下角组合:对每个 (x, y),向下找同列 +(bottomY),向右找同行 +(rightX),再验证 (rightX, bottomY) 是否也为 +;
-
严格边界校验(关键!):调用 isRectangle() 检查该四点围成的区域是否满足矩形语义:
- 四个顶点必须全为 +;
- 上/下边(y === startY 或 y === endY)中,仅顶点允许为 +,其余位置可为 - 或空格(但题目未强制要求 -,故实际只需保证非顶点处不出现非法字符);
- 左/右边(x === startX 或 x === endX)中,非顶点位置必须为 |;
- 内部区域(非边界)不能含 +(避免跨矩形干扰),且通常为空格(本题未限定,但 isRectangle 中已禁止内部出现 +);
- 生成标准化矩形:验证通过后,不从原图截取,而是调用 drawRectangle(width, height) 生成规范矩形字符串——这规避了原图中混合边线、嵌套干扰等问题,确保输出格式统一、语义纯净。
? 关键代码解析
function* getFigureRectangles(figure) {
const lines = figure.split("\n");
const height = lines.length;
const width = lines[0]?.length || 0;
for (let y = 0; y < height; y++) {
for (let x = 0; x < width; x++) {
if (lines[y][x] === "+") {
// 向下找同一列的 '+'(潜在底边)
for (let bottomY = y + 1; bottomY < height; bottomY++) {
if (lines[bottomY][x] === "+") {
// 向右找同一行的 '+'(潜在右边)
for (let rightX = x + 1; rightX < width; rightX++) {
if (lines[y][rightX] === "+") {
// 验证右下角是否存在 '+'
if (lines[bottomY][rightX] === "+") {
// 严格验证矩形结构
if (isRectangle(lines, x, y, rightX, bottomY)) {
// 生成标准矩形(非截取!)
yield drawRectangle(rightX - x + 1, bottomY - y + 1);
// 找到即跳出内层循环,避免重复匹配同一矩形
rightX = width;
bottomY = height;
}
}
}
}
}
}
}
}
}
}⚠️ 注意事项与最佳实践
- 不修改原图:原始代码尝试用空格覆盖已匹配区域,破坏后续扫描逻辑;新方案完全只读,安全可靠;
- 避免重复匹配:一旦确认有效矩形,立即 break 内层循环(通过 rightX = width; bottomY = height; 实现),防止同一矩形被多次生成;
- 鲁棒性处理:drawRectangle 生成的矩形始终以 + 为角、- 为横边、| 为竖边、空格为内部——符合典型 ASCII 矩形规范,且与输入图形风格解耦;
- 边界条件防御:lines[0]?.length 防止空行导致 undefined;y <= endY 和 x <= endX 在 isRectangle 中确保全覆盖检查;
- 性能提示:时间复杂度为 O(H×W×H×W),对中小型 ASCII 图(如 ≤50×50)完全可行;若需优化,可预处理 + 坐标索引表。
✅ 总结
该方案摒弃了“就地裁剪”的脆弱思路,转而采用几何探测 + 语义验证 + 标准化生成的三层架构,既保证了结果正确性(精准识别所有独立矩形),又提升了鲁棒性与可维护性。对于类似 ASCII 解析任务(如电路图、表格识别),此模式可作为通用设计范式参考。

















