Polygonal Line Search
Polygonal Line Search
回を追うごとにソースが汚くなってくるなぁ(・・;
アルゴリズムは,
- 基準の座標を,原点から始まるように直す
- 回転させて比べる
- 順番の前と後ろを入れ替える
- 回転させて比べる
です.
何度でも言う,解ければいいのさorz
#include <stdio.h> #define X 0 #define Y 1 #define NOT 20000 int main(void) { // ファイル出力準備 FILE *pfI; // 入力ファイルポインタ FILE *pfO; // 出力ファイルポインタ pfI = fopen("b.in", "r"); if(pfI == NULL) { printf("ERR: input file open\n"); return -1; } pfO = fopen("b.out","w"); if(pfO == NULL) { printf("ERR: output file open\n"); fclose(pfI); return -2; } while(1) { // // 入力 // int n; // 折れ線の数 int m; // 頂点の数 int b[2][10]; // 比較もとのポリゴン for(int j = 0; j < 10; j++) b[X][j] = b[Y][j] = NOT; fscanf(pfI, "%d ", &n); printf("%d\n", n); if(n == 0) break; printf("SRC\n"); fscanf(pfI, "%d ", &m); printf("%d\n", m); for(int j = 0; j < m; j++) { fscanf(pfI, "%d %d ", &b[X][j], &b[Y][j]); printf("%d %d\n", b[X][j], b[Y][j]); } // 最初の点を原点にあわせる int tmpbX1 = b[X][0]; int tmpbY1 = b[Y][0]; for(int k = 0; k < m; k++) { b[X][k] -= tmpbX1; b[Y][k] -= tmpbY1; } for(int i = 0; i < n; i++) { printf("DST %d\n", i+1); fscanf(pfI, "%d ", &m); printf("%d\n", m); int c[2][10]; // 比較先のポリゴン 行 0: x, 1: y for(int j = 0; j < 10; j++) c[X][j] = c[Y][j] = NOT; for(int j = 0; j < m; j++) { fscanf(pfI, "%d %d ", &c[X][j], &c[Y][j]); printf("%d %d\n", c[X][j], c[Y][j]); } // // 処理 // // 最初の点を原点にあわせる int tmpCX1 = c[X][0]; int tmpCY1 = c[Y][0]; for(int k = 0; k < m; k++) { c[X][k] -= tmpCX1; c[Y][k] -= tmpCY1; } for(int k = 0; k < 4; k++) { int t[2][10]; // 比較先のポリゴン 行 0: x, 1: y int diff = 0; switch(k) { case 0: // 右 diff = 0; for(int l = 0; l < m; l++) { t[X][l] = c[X][l]; t[Y][l] = c[Y][l]; if(b[X][l] != t[X][l] || b[Y][l] != t[Y][l]) diff++; } if(diff == 0) { fprintf(pfO, "%d\n", i+1); } break; case 1: // 上 diff = 0; for(int l = 0; l < m; l++) { t[X][l] = -c[Y][l]; t[Y][l] = c[X][l]; printf("u %d, %d\n", t[X][l], t[Y][l]); if(b[X][l] != t[X][l] || b[Y][l] != t[Y][l]) diff++; } if(diff == 0) { fprintf(pfO, "%d\n", i+1); } break; case 2: // 左 diff = 0; for(int l = 0; l < m; l++) { t[X][l] = -c[X][l]; t[Y][l] = -c[Y][l]; printf("l %d, %d\n", t[X][l], t[Y][l]); if(b[X][l] != t[X][l] || b[Y][l] != t[Y][l]) diff++; } if(diff == 0) { fprintf(pfO, "%d\n", i+1); } break; case 3: // 下 diff = 0; for(int l = 0; l < m; l++) { t[X][l] = c[Y][l]; t[Y][l] = -c[X][l]; printf("d %d, %d\n", t[X][l], t[Y][l]); if(b[X][l] != t[X][l] || b[Y][l] != t[Y][l]) diff++; } if(diff == 0) { fprintf(pfO, "%d\n", i+1); } break; } } // // 後ろから点を追う // 前と後ろを逆にする int tmp[2][10]; for(int k = 0; k < m; k++) { tmp[X][k] = c[X][k]; tmp[Y][k] = c[Y][k]; } for(int k = 0; k < m; k++) { c[X][k] = tmp[X][m-k-1]; c[Y][k] = tmp[Y][m-k-1]; } // 最初の点を原点にあわせる int tmpCX = c[X][0]; int tmpCY = c[Y][0]; for(int k = 0; k < m; k++) { c[X][k] -= tmpCX; c[Y][k] -= tmpCY; } for(int k = 0; k < 4; k++) { int t[2][10]; // 比較先のポリゴン 行 0: x, 1: y int diff = 0; switch(k) { case 0: // 右 diff = 0; for(int l = 0; l < m; l++) { t[X][l] = c[X][l]; t[Y][l] = c[Y][l]; if(b[X][l] != t[X][l] || b[Y][l] != t[Y][l]) diff++; } if(diff == 0) { fprintf(pfO, "%d\n", i+1); } break; case 1: // 上 diff = 0; for(int l = 0; l < m; l++) { t[X][l] = -c[Y][l]; t[Y][l] = c[X][l]; printf("u %d, %d\n", t[X][l], t[Y][l]); if(b[X][l] != t[X][l] || b[Y][l] != t[Y][l]) diff++; } if(diff == 0) { fprintf(pfO, "%d\n", i+1); } break; case 2: // 左 diff = 0; for(int l = 0; l < m; l++) { t[X][l] = -c[X][l]; t[Y][l] = -c[Y][l]; printf("l %d, %d\n", t[X][l], t[Y][l]); if(b[X][l] != t[X][l] || b[Y][l] != t[Y][l]) diff++; } if(diff == 0) { fprintf(pfO, "%d\n", i+1); } break; case 3: // 下 diff = 0; for(int l = 0; l < m; l++) { t[X][l] = c[Y][l]; t[Y][l] = -c[X][l]; printf("d %d, %d\n", t[X][l], t[Y][l]); if(b[X][l] != t[X][l] || b[Y][l] != t[Y][l]) diff++; } if(diff == 0) { fprintf(pfO, "%d\n", i+1); } break; } } } fprintf(pfO, "+++++\n"); } //ファイルポインタを閉じる fclose(pfI); fclose(pfO); return 0; }