解いた問題のソースコードと解説など。


POJ 2954 Triangle

問題

3つの格子点の座標が与えられる。この格子点からなる三角形の内部にある格子点数を求めよ。ただし、辺上の格子点は数えない。また、与えられる三角形の面積は必ず0より大きい。

やりかた

ピックの定理を使った。

(ピックの定理)
頂点がすべて格子点上にあるような多角形の面積Sは、多角形内部(辺上を除く)にある格子点数をa、辺上にある格子点数をbとした時、以下の式で求められる。
S = a + \frac{1}{2}b - 1

以下ソース。

int gcd(int a, int b){ return b == 0 ? a : gcd(b, a % b); }

int main(int argc, char **argv){
  int x1, y1, x2, y2, x3, y3;
  while(cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3){
    if(x1 == 0 && y1 == 0 && x2 == 0 && y2 == 0 && x3 == 0 & y3 == 0) break;
    //辺上の格子点数
    int b = gcd(abs(x1 - x2), abs(y1 - y2)) + gcd(abs(x2 - x3), abs(y2 - y3)) + gcd(abs(x3 - x1), abs(y3 - y1));
    int S2 = abs((x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1));
    cout << (S2 + 2 - b) / 2 << endl;
  }
  return 0;
}
Get up! 明日のSUPER ST@R!