C# 修改二维数组两对角点间区域元素的方法死循环问题求解
问题根因
你的逻辑在某一轴到达终点后,步进另一轴时会直接把已完成的轴重置回起始位置,当两个轴都到达终点前,就会出现已经遍历完成的轴被重置,导致永远无法满足currentX == _endCoord.xPos && currentY == _endCoord.yPos的循环退出条件,同时最后一个对角点的元素也没有被处理。
修复方案
不需要手动处理遍历方向,先计算矩形边界的上下限值,直接双重循环遍历即可,逻辑更简洁也不会出现死循环:
struct Point { public int xPos; public int yPos; public Point(int _x, int _y) { xPos = _x; yPos = _y; } } //给定两个对角点,切换两点间区域的元素状态 static void ToggleBits(Point _startCoord, Point _endCoord) { // 计算矩形的X轴范围 int minX = Math.Min(_startCoord.xPos, _endCoord.xPos); int maxX = Math.Max(_startCoord.xPos, _endCoord.xPos); // 计算矩形的Y轴范围 int minY = Math.Min(_startCoord.yPos, _endCoord.yPos); int maxY = Math.Max(_startCoord.yPos, _endCoord.yPos); // 遍历整个矩形区域 for (int x = minX; x <= maxX; x++) { for (int y = minY; y <= maxY; y++) { Console.WriteLine($"{x},{y}"); lightMap[x, y] = !lightMap[x, y]; } } }
该方案优势:
- 自动支持任意方向的对角点输入,不需要手动处理步进方向
- 没有死循环风险,逻辑清晰易维护
- 自动覆盖单点重合的场景,不需要额外做特殊判断
内容的提问来源于stack exchange,提问作者Luc
相关产品推荐
相关产品推荐

