본문 바로가기

C, C++, C#/Algorithm

The Next Higher Permutation 반복(iterater)

반응형

The Next Higher Permutation 반복형으로 트리형식으로 모든 경우의 수를 구하는 알고리즘입니다.


이전 글인 재귀형과 같은 결과가 나와요 재귀형에 비해 약간 지저분한 느낌이 없지않게 있지만... 결과는 나오니까요..!


큰 도움이 안되더라도 참고하듯 봐주세요...



#include "stdafx.h"

#include <stdio.h>

#include <time.h>

#include <stdlib.h>

#include <math.h>


int nNumItemCnt = 0;


int g_Array[100];


int num_of_test = 0;

int rand_seed = 0;


void initialize();

int generateNextHigherPermutationItem();

void printItem();

void Exchange_Sort(int index_i);


//! 거리

double calc(float n[],float nGo[]);


//! 처음이 제일 작은 거리 숫자 다음이 7개 번호 나열

double g_dMinRange = 10000;

int g_nMinRange[100] = {10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000,10000};



void main() 

{

bool bFlag = false;

while (1)

{

printf("몇개의 숫자를 Permutation-iterator하시겠습니까");

scanf_s("%d", &nNumItemCnt);

printf("Cnt : %5d \n", nNumItemCnt);


if(nNumItemCnt > 100)

{

printf("끝!");

break;

}



clock_t start, finish;

start = clock();

double time_total = 0.0;



int check = 1;


initialize();

while (check == 1)

{

printItem();

check = generateNextHigherPermutationItem();

}


finish = clock();


for(int i = 0; i < nNumItemCnt; i++)

{

printf("%5d", g_nMinRange[i]);

}

printf("\n최소 거리 : %lf", g_dMinRange);

printf("\n");



time_total = ((double)(finish - start) / CLOCKS_PER_SEC);

printf("걸린 시간 : %lf \n\n", time_total);

}



}


void initialize() 

{

for (int i = 0; i < 100; i++) 

{

g_Array[i] = i+1;


g_nMinRange[i] = 1000;

}

g_dMinRange = 10000;


}


int generateNextHigherPermutationItem() 

{

int index_i, index_j;


int min, temp;


int check = 0;


for (int i = nNumItemCnt - 2; i >= 0; i--) 

{

if (g_Array[i] < g_Array[i + 1]) {

index_i = i;

check = 1;

break;

}

}


if(check == 1)

{

min = nNumItemCnt + 1;

for (int j = nNumItemCnt - 1; j > index_i; j--) 

{

if (g_Array[j] > g_Array[index_i] && g_Array[j] < min) 

{

min = g_Array[j];

index_j = j;


//강제 break(맨 앞자리가 1까지만 하기위해)

//if(min == 2)

// return 0;

}

}


temp = g_Array[index_i];

g_Array[index_i] = g_Array[index_j];

g_Array[index_j] = temp;


Exchange_Sort(index_i);

}


return check;

}


void printItem() 

{

//! 현재의 거리

double dRange = 0.0;


for (int i = 0; i < nNumItemCnt; i++) 

{

//! 그냥 가지고 있는곳을 출력하는곳

printf("%5d", g_Array[i]);


float fXy[2] = {0,0};

float fXyGo[2] = {0,0};


fXy[0] = g_Array[i];

fXy[1] = g_Array[i + 1];


fXyGo[0] = g_Array[i + 1];

fXyGo[1] = g_Array[i + 2];


dRange += calc(fXy, fXyGo);

}


printf("\t%lf", dRange);

printf("\n");


if(dRange < g_dMinRange)

{

g_dMinRange = dRange;


for (int i = 0; i < nNumItemCnt; i++) 

{

g_nMinRange[i] = g_Array[i];

}

}

}


void Exchange_Sort(int index_i) {

int smallest;

int temp;


for (int i = index_i + 1; i < nNumItemCnt - 1; i++) 

{

smallest = i;

for (int j = i + 1; j < nNumItemCnt; j++) 

{

if (g_Array[j] < g_Array[smallest]) 

{

smallest = j;

}

temp = g_Array[i];

g_Array[i] = g_Array[smallest];

g_Array[smallest] = temp;

}

}

}


double calc(float n[],float nGo[])

{

int nX1 = n[0];

int nY1 = n[1];

int nX2 = nGo[0];

int nY2 = nGo[1];

return sqrt((double)(pow(double(nX2 - nX1), 2) + pow(double(nY2 - nY1), 2)));

}



혹시 복사가 안되면 말해주세요(아직 처음이라 잘 몰라요 ㅠ)

visual studio 2012에서 코딩해습니다.





The Next Higher Permutation

The Next Higher Permutation c code

The Next Higher Permutation example

The Next Higher Permutation 반복 

The Next Higher Permutation iterater

반응형

'C, C++, C# > Algorithm' 카테고리의 다른 글

피보나치 수열 반복형  (0) 2016.11.23
하노이의탑 반복형  (0) 2016.11.16
하노이의 탑 c 예제  (0) 2016.11.10
피보나치 수열 재귀  (0) 2016.11.04
The Next Higher Permutation 재귀(Recursive)  (0) 2016.11.02