一些自己有时候会用的板子

  • 两线段相交判断代码

    struct Line {
    double x1;
    double y1;
    double x2;
    double y2;
    };

    bool intersection(const Line &l1, const Line &l2) {
    // 快速排斥实验
    if ((l1.x1 > l1.x2 ? l1.x1 : l1.x2) < (l2.x1 < l2.x2 ? l2.x1 : l2.x2) ||
    (l1.y1 > l1.y2 ? l1.y1 : l1.y2) < (l2.y1 < l2.y2 ? l2.y1 : l2.y2) ||
    (l2.x1 > l2.x2 ? l2.x1 : l2.x2) < (l1.x1 < l1.x2 ? l1.x1 : l1.x2) ||
    (l2.y1 > l2.y2 ? l2.y1 : l2.y2) < (l1.y1 < l1.y2 ? l1.y1 : l1.y2)) {
    return false;
    }
    // 跨立实验
    if ((((l1.x1 - l2.x1) * (l2.y2 - l2.y1) - (l1.y1 - l2.y1) * (l2.x2 - l2.x1)) *
    ((l1.x2 - l2.x1) * (l2.y2 - l2.y1) - (l1.y2 - l2.y1) * (l2.x2 - l2.x1))) > 0 ||
    (((l2.x1 - l1.x1) * (l1.y2 - l1.y1) - (l2.y1 - l1.y1) * (l1.x2 - l1.x1)) *
    ((l2.x2 - l1.x1) * (l1.y2 - l1.y1) - (l2.y2 - l1.y1) * (l1.x2 - l1.x1))) > 0) {
    return false;
    }
    return true;
    }
  • 验证日期合法性

    bool isLegal(int _year, int _month, int _day) {
    // 检测是否合法
    // 初步大体判断
    if (_year <= 0 || _month <= 0 || _month > 12 || _day <= 0 || _day > 31) {
    return false;
    }

    // 按月判断
    if (1 == _month || 3 == _month || 5 == _month || 7 == _month || 8 == _month || 10 == _month || 12 == _month) {
    return true;
    } else if (4 == _month || 6 == _month || 9 == _month || 11 == _month) {
    if (_day > 30) {
    return false;
    } else {
    return true;
    }
    } else {
    if (((_year % 4 == 0) && (_year % 100 != 0)) || (_year % 400 == 0)) {
    if (_day > 29) {
    return false;
    } else {
    return true;
    }
    } else {
    if (_day > 28) {
    return false;
    } else {
    return true;
    }
    }
    }
    }

个人备忘

  • 整行读入字符串,忽略空格分割
    std::getline(std::cin, name);