[boj] 1002. ブレード(node.js)


問題の概要


[boj] 1002. ブレード(node.js)

に答える

  • の2つの円の位置関係では、中心間の距離と2つの円の半径の長さによって接触点の個数を決定する問題がある.
  • 元の位置関係は,中心間の距離と半径の差和が分かれば求めることができる.
  • まず、内接と外接を区別してこそ、どのような条件でこの状況を把握するかを決定することができる.
  • 内、外接は内接、外接の中心間の距離を理解し、半径の差、和を基準に区間を区分した後に区分することができる.距離<差は接点のない内接、距離>と接点のない外接である.残りの[差<=距離<=和](Difference<=Distance<=和)区間では、==の場合、1つのポイントで正接します.そうしないと、2つの頂点が生成されます.
  • のブログを参照:https://mathbang.net/101(図に示すように、理解速度が速い)
  • 説明する

    const readline = require("readline");
    const rl = readline.createInterface({
      input: process.stdin,
      output: process.stdout,
    });
    
    const solution = () => {
      const [x1, y1, r1, x2, y2, r2] = input().split(" ").map(Number);
      const dist = Math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2);
      const sum = r1 + r2;
      const diff = Math.abs(r1 - r2);
      if (dist == 0 && diff == 0) return -1;
      if (dist < diff) {
        return 0;
      } else if (dist < sum) {
        if (dist == diff) return 1;
        return 2;
      } else {
        if (dist == sum) return 1;
        return 0;
      }
    };
    
    let _line = 0;
    const input = () => stdin[_line++];
    
    let stdin = [];
    rl.on("line", function (line) {
      stdin.push(line);
    }).on("close", function () {
      let T = Number(input());
      let result = [];
      while (T--) {
        result.push(solution());
      }
      console.log(result.join("\n"));
      process.exit();
    });

    くどくど言う

  • 段階で解くのは初期は簡単だと思っていましたが、本当に数学的なアプローチが必要なので、思ったより時間がかかりました.円の位置関係の問題であることを知った後、状況の数を考慮して、問題を軽視して、間違った公式を創立して、それからデバッグを続けて、努力して反例を求めて、やっと私がアルゴリズムに対してあまり理解していないことに気づいた.
  • アルゴリズムの問題を解くときは、解答プロセスから最後までロジックをチェックし、スタンバイコード作成能力を目指しましょう.