1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| #include <iostream> #include <vector>
using namespace std;
// 定义点结构 struct Point { int x, y; // 点的坐标 int degree; // 点的边权(需要连接的边数) };
// 定义一个方向数组,表示右、下 int dx[] = {1, 0}; // 横向和竖向(x+1, y)表示右边,(x, y+1)表示下方 int dy[] = {0, 1};
// 检查是否可以在(x1, y1)和(x2, y2)之间连接边 bool canConnect(int x1, int y1, int x2, int y2, vector<vector<int>>& grid) { // 确保(x2, y2)在图的范围内,且没有交叉边 if (x2 < 0 || y2 < 0 || x2 >= grid.size() || y2 >= grid[0].size()) return false; if (grid[x1][y1] || grid[x2][y2]) return false; return true; }
// 主函数:连接点的边,确保边不交叉 void connectPoints(vector<Point>& points, int n, int m) { // 创建一个网格表示是否有边(或点) vector<vector<int>> grid(n, vector<int>(m, 0));
// 遍历所有点 for (auto& p : points) { int x = p.x, y = p.y, degree = p.degree; grid[x][y] = 1; // 将该点标记为存在 // 尝试为该点连接degree条边 for (int i = 0; i < degree; ++i) { for (int d = 0; d < 2; ++d) { // 遍历两个方向(右和下) int nx = x + dx[d]; int ny = y + dy[d]; if (canConnect(x, y, nx, ny, grid)) { grid[nx][ny] = 1; // 连接边并标记 break; // 连接成功,退出当前方向的尝试 } } } } }
int main() { int n = 5, m = 5; // 网格大小 vector<Point> points = { {0, 0, 2}, // (x, y, 边权) {2, 1, 1}, {3, 4, 3}, };
connectPoints(points, n, m);
return 0; }
|