Polygonal Line Search

Polygonal Line Search
回を追うごとにソースが汚くなってくるなぁ(・・;
アルゴリズムは,

  1. 基準の座標を,原点から始まるように直す
  2. 回転させて比べる
  3. 順番の前と後ろを入れ替える
  4. 回転させて比べる

です.

何度でも言う,解ければいいのさ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;
}