#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#pragma warning(disable:4996)
typedef struct ChSet // 각 정보를 담은 구조체
{
char* NowCh; // 현재 자리수
char CharSet[129]; // 문자셋
int ChSetLen; // 문자셋 길이
int Min; // 최소 자리수
int Max; // 최대 자리수
int Complete; // 완료한 자리수
}CHSET;
int brute(CHSET *ChSet, int NowCount);
int main()
{
CHSET ChSet;
memset(&ChSet, 0, sizeof(ChSet));
printf("최소 자리 입력 : ");
scanf("%d", &ChSet.Min);
printf("최대 자리 입력 : ");
scanf("%d", &ChSet.Max);
clock_t start_time, end_time; // clock_t
start_time = clock(); // Start_Time
strcpy(ChSet.CharSet, "abcdefghijklmnopqrstuvwxyz1234567890"); // 대입할 문자 셋
ChSet.ChSetLen = strlen(ChSet.CharSet);
ChSet.NowCh = (char*)malloc(sizeof(ChSet.Max + 1));
memset(ChSet.NowCh, 0, sizeof(ChSet.NowCh));
brute(&ChSet, NULL);
end_time = clock(); // End_Time
printf("Time : %f\n", ((double)(end_time - start_time)) / CLOCKS_PER_SEC);
return 0;
}
int brute(CHSET *ChSet, int NowCount)
{
int check = 1;
NowCount++;
ChSet->NowCh[NowCount] = NULL; // 문자열 끝을 NULL 로 초기화
while (NowCount <= ChSet->Max && check)
{
// 문자셋에 입력된 것들로 반복 대입
for (int i = 0; i < ChSet->ChSetLen; i++)
{
ChSet->NowCh[NowCount - 1] = ChSet->CharSet[i];
// 최소 자리 혹은 완료한 자리 보다 작으면 재귀호출
if (NowCount < ChSet->Min || NowCount < ChSet->Complete)
{
check = brute(ChSet, NowCount);
// 종료 조건
if (check == -1)
return -1;
}
if (NowCount >= ChSet->Complete)
printf("%s\t", ChSet->NowCh);
}
if (NowCount >= ChSet->Complete)
ChSet->Complete = NowCount;
if (NowCount != 1)
check = 0;
if (NowCount == 1)
ChSet->Complete++;
}
if (NowCount == 1)
return 0;
else if (NowCount > ChSet->Max)
return -1;
else
return 1;
}