fork download
  1. #include <iostream>
  2. #include <math.h>
  3. #include <stdio.h>
  4. using namespace std;
  5. //記述に1時間かかりました
  6. //20分で完璧なコードを書けるという感覚はないです
  7. //仕事ではないのでコード品質を上げるためのテストデータの作成やコードのチェック時間はとってません
  8. //一発で間違いなく最小のコードで書けるかに挑戦してみましたが未熟ですので間違いがあるかもしれません。
  9.  
  10.  
  11. //円外0 円周上1 円内2
  12. char table[3][3]={ {0, 1, 'F'},
  13. {1, 'C', 'B'},
  14. {'F','B','A'}};
  15.  
  16. int f(long long int len,long long int r){
  17. if(len<r)return 2;
  18. if(len==r)return 1;
  19. return 0;
  20. }
  21.  
  22. void commit(long long int r,
  23. long long int x0,long long int y0,
  24. long long int x1,long long int y1){
  25. int t1,t2;
  26. //円の中心を原点Oとして計算する
  27. //線分AB、OからABに下ろした垂線の足をDとする
  28. long long int r2=r*r;
  29. t1=f(x0*x0+y0*y0,r2);
  30. t2=f(x1*x1+y1*y1,r2);
  31. char c3=table[t1][t2];
  32. char ans='Z';//おかしな答えの検出
  33. if(c3==0){
  34. //円外 円外
  35. //H、E、I
  36. long long int dx=x0-x1;
  37. long long int dy=y0-y1;
  38. //2S=|x0*y1-x1*y0|=U
  39. //2S=AB*OD
  40. //U/AB=OD=rなら接する
  41. long long int S1=x0*y1-x1*y0;
  42. if(S1<0)S1=-S1;
  43. long long int ab=hypot(dx,dy);
  44. if((ab*ab==dx*dx+dy*dy)&&(S1%ab==0)&&(S1/ab==r)){
  45. ans='H';
  46. }else{
  47. //三角形の面積が0の場合と
  48. //0以上の場合で分岐
  49. if(S1==0){
  50. //内積で判定する
  51. if(x0*x1+y0*y1>=0){
  52. ans='I';
  53. }else{
  54. ans='E';
  55. }
  56.  
  57. }else if(((double)S1/hypot(dx,dy)<r)){
  58. //問題の記述よりhypot(dx,dy)=0となる場合は考慮しない
  59. //本当は0除算エラーを書くべき
  60. //2016年5月25日修正A
  61. //採点データが不完全で多分(0,0)3/(3,1)(5,1)のようなケースがなかったので合格できたとはと推測
  62. //このケースへの対処を追加、未熟さを実感
  63. long long int r1=dx*x0+dy*y0;
  64. long long int r2=dx*x1+dy*y1;
  65. //修正A if文を追加
  66. if((r1<=0&&r2>=0)||(r1>=0&&r2<=0)){
  67. ans='E';
  68. }else{
  69. ans='I';
  70. }
  71. }else{
  72.  
  73. ans='I';
  74. }
  75. }
  76. }else if(c3==1){
  77. //円外 円周上
  78. //D G
  79. long long int vx,vy,dx,dy;
  80.  
  81. if(t1==1){
  82. vx=-y0;
  83. vy=x0;
  84. dx=-x0+x1;
  85. dy=-y0+y1;
  86.  
  87. }else if(t2==1){
  88. vx=-y1;
  89. vy=x1;
  90. dx=-x1+x0;
  91. dy=-y1+y0;
  92. }
  93. //外積で判断
  94. long long int g=vx*dy-vy*dx;
  95. if(g>=0){
  96. ans='D';
  97. }else{
  98. ans='G';
  99. }
  100.  
  101. }else{
  102. ans=c3;
  103. }
  104. printf("%c",ans);
  105. }
  106.  
  107. int main() {
  108. int x,y,r,x0,y0,x1,y1;
  109. while(scanf("(%d,%d)%d\/(%d,%d)(%d,%d) ",&x,&y,&r,&x0,&y0,&x1,&y1)!=EOF){
  110. commit(r,x0-x,y0-y,x1-x,y1-y);
  111. }
  112. return 0;
  113. }
Success #stdin #stdout 0s 3468KB
stdin
(0,0)3/(3,1)(5,1)
stdout
E