2011年6月14日火曜日

AOJ 1136

いろいろあって何故か長時間解けなかったのが解けたので。
問題文は日本語なので説明は無し。
元となる図形の始点と終点を原点に移動した物をそれぞれ用意。
その後比較するデータと回転させて4パターンの比較を行う。

  1. #include <iostream>  
  2. #include <vector>  
  3. #include <map>  
  4. #include <set>  
  5. #include <string.h>  
  6.   
  7. using namespace std;  
  8.   
  9. struct xy {  
  10.     int first;  
  11.     int second;  
  12. };  
  13.   
  14. xy presets1[1000];  
  15. xy input[1000];  
  16.   
  17. int main(void)  
  18. {  
  19.     int n;  
  20.     while (1) {  
  21.         cin >> n;  
  22.         if (n == 0) {  
  23.             break;  
  24.         }  
  25.           
  26.         memset(presets1 , 0 , sizeof(presets1));  
  27.         memset(input , 0 , sizeof(input));  
  28.         int m;  
  29.         cin >> m;  
  30.         for (int i = 0 ; i < m ; i++) {  
  31.             cin >> presets1[i].first >> presets1[i].second;  
  32.         }  
  33.   
  34.         for (int i = 0 ; i < n ; i++) {  
  35.             int check;  
  36.             cin >> check;  
  37.             for (int j = 0 ; j < check ; j++) {  
  38.                 cin >> input[j].first >> input[j].second;  
  39.             }  
  40.             if (m != check) {  
  41.                 continue;  
  42.             }  
  43.             for (int k = 0 ; k < 4 ; k++) {  
  44.                 int ix0 = input[0].first;  
  45.                 int iy0 = input[0].second;  
  46.                 int px0 = presets1[0].first;  
  47.                 int py0 = presets1[0].second;  
  48.                 for (int j = 0 ; j < check ; j++) {  
  49.                     if (presets1[j].first - px0 != input[j].first - ix0 || presets1[j].second - py0 != input[j].second - iy0) {  
  50.                         goto NEXT;  
  51.                     }  
  52.                 }  
  53.                 cout << i + 1 << endl;  
  54.                 goto END;  
  55.     NEXT:;  
  56.                 px0 = presets1[check - 1].first;  
  57.                 py0 = presets1[check - 1].second;  
  58.                 for (int j = 0 ; j < check ; j++) {  
  59.                     if (presets1[check - j - 1].first - px0 != input[j].first - ix0 || presets1[check - j - 1].second - py0 != input[j].second - iy0) {  
  60.                         goto NEXT2;  
  61.                     }  
  62.                 }  
  63.                 cout << i + 1 << endl;  
  64.                 goto END;  
  65. NEXT2:;  
  66.                 //回転作業  
  67.                 for (int j = 0 ; j < check ; j++) {  
  68.                     int temp = input[j].first;  
  69.                     input[j].first = input[j].second;  
  70.                     input[j].second = -temp;  
  71.                 }  
  72.             }  
  73. END:;  
  74.         }  
  75.         cout << "+++++" << endl;  
  76.     }  
  77.         return 0;  
  78. }  

0 件のコメント:

コメントを投稿