Organize Your Train part II

mike0615

全パターンを1つの配列に入れて,最後に(全パターンの長さ)/(1パターン文の長さ)でパターン数を出してます.
こぴぺしまくったから,もっときれいにしようと思えばできたね.

#include <stdio.h>
#include <string.h>

//	順を反転
void r(char* s)
{
	char *t = new char [strlen(s)+1];
	strcpy(t, s);

	for(int i = 0; i < strlen(s); i++)
	{
		s[i] = t[strlen(s)-i-1];
	}

	delete [] t;
}

//	同じ編成が過去にないかチェック
bool c(char *s1, char *s2, char *a)
{
	//	sにつなげる
	char *s = new char [strlen(s1) + strlen(s2) +1];
	strcpy(s, s1);
	strcpy(&s[strlen(s)], s2);
	printf("%s ", s);

	for(int i = 0; i < strlen(a)/strlen(s); i++)
	{
		bool f = true;
		for(int j = 0; j < strlen(s); j++)
		{
			if(s[j] - a[i*strlen(s) + j] != 0)
			{
				f = 0;
			}
		}
		if(f)
			return true;
	}

	delete [] s;

	return false;
}

int main(void)
{
	//char *a = "abcaabcf";
	//char *s1 = "ab";
	//char *s2 = "cd";

	//printf("%d\n", c(s1, s2, a));

	//	ファイル出力準備
	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;
	}

	//
	//	入力
	//
	int m;
	fscanf(pfI, "%d", &m);

	for(int i = 0; i < m; i++)
	{
		char s[72];
		fscanf(pfI, "%s", s);
		printf("%s\n", s);

		//
		//	処理
		//
		int k = 0;	//	編成の種類
		char *a = new char [5000];	//	正解の編成の群
		int ai = 0;	//	インデックス
		for(int j = 1; j < strlen(s); j++)
		{
			char *t = new char [strlen(s)+1];	//	処理に使う文字列
			char *ub = new char [strlen(s)+1];	//	処理
			char *uf = new char [strlen(s)+1];	//	処理

			char *f = new char [strlen(s)+1];	//	前の編成
			char *b = new char [strlen(s)+1];	//	後ろの編成
			
			strcpy(t, s);
			strcpy(b, &t[j]);
			t[j] = '\0';
			strcpy(f, t);


			//	前後の編成はそのまま
			strcpy(uf, f);
			strcpy(ub, b);
			printf("  : %s %s\n", uf, ub);
			if(!c(uf, ub, a))
			{
				char *tmp = new char [strlen(uf) + strlen(ub) +1];
				strcpy(tmp, uf);
				strcpy(&tmp[strlen(tmp)], ub);

				for(int k = 0; k < strlen(s); k++)
					a[ai+k] = tmp[k];
				ai += strlen(s);
				a[ai] = '\0';
				printf("%s\n", a);
			}

			//	前のみ順逆
			strcpy(uf, f);
			strcpy(ub, b);
			r(uf);
			printf("f : %s %s\n", uf, ub);
			if(!c(uf, ub, a))
			{
				char *tmp = new char [strlen(uf) + strlen(ub) +1];
				strcpy(tmp, uf);
				strcpy(&tmp[strlen(tmp)], ub);

				for(int k = 0; k < strlen(s); k++)
					a[ai+k] = tmp[k];
				ai += strlen(s);
				a[ai] = '\0';
				printf("%s\n", a);
			}

			//	後ろのみ順逆
			strcpy(uf, f);
			strcpy(ub, b);
			r(ub);
			printf("b : %s %s\n", uf, ub);
			if(!c(uf, ub, a))
			{
				char *tmp = new char [strlen(uf) + strlen(ub) +1];
				strcpy(tmp, uf);
				strcpy(&tmp[strlen(tmp)], ub);

				for(int k = 0; k < strlen(s); k++)
					a[ai+k] = tmp[k];
				ai += strlen(s);
				a[ai] = '\0';
				printf("%s\n", a);
			}

			//	前後とも順逆
			strcpy(uf, f);
			strcpy(ub, b);
			r(uf);
			r(ub);
			printf("fb: %s %s\n", uf, ub);
			if(!c(uf, ub, a))
			{
				char *tmp = new char [strlen(uf) + strlen(ub) +1];
				strcpy(tmp, uf);
				strcpy(&tmp[strlen(tmp)], ub);

				for(int k = 0; k < strlen(s); k++)
					a[ai+k] = tmp[k];
				ai += strlen(s);
				a[ai] = '\0';
				printf("%s\n", a);
			}


			printf("-----\n");


			//	前後の編成は逆
			strcpy(uf, b);
			strcpy(ub, f);
			printf("  : %s %s\n", uf, ub);
			if(!c(uf, ub, a))
			{
				char *tmp = new char [strlen(uf) + strlen(ub) +1];
				strcpy(tmp, uf);
				strcpy(&tmp[strlen(tmp)], ub);

				for(int k = 0; k < strlen(s); k++)
					a[ai+k] = tmp[k];
				ai += strlen(s);
				a[ai] = '\0';
				printf("%s\n", a);
			}

			//	前のみ順逆
			strcpy(uf, b);
			strcpy(ub, f);
			r(uf);
			printf("f : %s %s\n", uf, ub);
			if(!c(uf, ub, a))
			{
				char *tmp = new char [strlen(uf) + strlen(ub) +1];
				strcpy(tmp, uf);
				strcpy(&tmp[strlen(tmp)], ub);

				for(int k = 0; k < strlen(s); k++)
					a[ai+k] = tmp[k];
				ai += strlen(s);
				a[ai] = '\0';
				printf("%s\n", a);
			}

			//	後ろのみ順逆
			strcpy(uf, b);
			strcpy(ub, f);
			r(ub);
			printf("b : %s %s\n", uf, ub);
			if(!c(uf, ub, a))
			{
				char *tmp = new char [strlen(uf) + strlen(ub) +1];
				strcpy(tmp, uf);
				strcpy(&tmp[strlen(tmp)], ub);

				for(int k = 0; k < strlen(s); k++)
					a[ai+k] = tmp[k];
				ai += strlen(s);
				a[ai] = '\0';
				printf("%s\n", a);
			}

			//	前後とも順逆
			strcpy(uf, b);
			strcpy(ub, f);
			r(uf);
			r(ub);
			printf("fb: %s %s\n", uf, ub);
			if(!c(uf, ub, a))
			{
				char *tmp = new char [strlen(uf) + strlen(ub) +1];
				strcpy(tmp, uf);
				strcpy(&tmp[strlen(tmp)], ub);

				for(int k = 0; k < strlen(s); k++)
					a[ai+k] = tmp[k];
				ai += strlen(s);
				a[ai] = '\0';
				printf("%s\n", a);
			}


			printf("==========\n");

			delete [] t;
			delete [] uf;
			delete [] ub;
			delete [] f;
			delete [] b;
		}
		printf("@@@ %d\n", strlen(a)/strlen(s));
		fprintf(pfO, "%d\n", strlen(a)/strlen(s));

		delete [] a;
	}

	//	ファイル出力
	//fprintf(pfO, "Hello World!! - out\n");

	//ファイルポインタを閉じる
	fclose(pfI);
	fclose(pfO);

	return 0;
}