Organize Your Train part II
全パターンを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; }