게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
C++ n 개 원소중에 모든 m 쌍 뽑기 -> 이거 질문하신분 보세요.
게시물ID : programmer_5570짧은주소 복사하기
작성자 : 상사꽃
추천 : 0
조회수 : 596회
댓글수 : 3개
등록시간 : 2014/09/22 15:58:18
댓글에 답글을 달려하니 동일한글자를 반복적으로 쓸 수 없다고 해서
새로 글을 썼습니다.

예전에 비슷한 걸 만든 기억이 있어 코드를 찾아봤네요.
배경 지식은 http://jinsolkim.kr/50187137320 에서 얻었습니다.
다시 보니 뭔소린지... 가물가물하네요. ;
 
아무튼, 아래 코드와 같이 돌려 원하는 값을 얻었습니다.
뭔가 지저분해 보이는 느낌도 들고... ㅜ.ㅠ
 
 
#include <cstdio>
#include <cstring>
#include <string>
#include <list>
#include <set>
#include <algorithm>
using namespace std ;
int reverseList(list<int>* listInt, list<int>::iterator listIntIter)
{
        set<int>                        setInt ;
        set<int>::iterator      setIntIter ;
        while(listIntIter != listInt->end())
        {
                setInt.insert(*listIntIter) ;
                listIntIter = listInt->erase(listIntIter) ;
        }
        if(setInt.empty())
                return 0 ;
        setIntIter = setInt.end() ;
        while(1)
        {
                setIntIter-- ;
                listInt->push_back(*setIntIter) ;
                if(setIntIter == setInt.begin())
                        break ;
        }
        return 1 ;
}
int next_k_combination(list<int>* listInt, int k)
{
        list<int>::iterator     listIntIter ;
        list<int>::iterator     listEndIter ;
        list<int>::iterator     listNextIter ;
        int flagIsSorted = 0 ;
        while(1)
        {
                listIntIter = listInt->begin() ;
                for(int ii = 0; ii < k; ii++)
                        listIntIter++ ;
                reverseList(listInt, listIntIter) ;
                if(!next_permutation(listInt->begin(), listInt->end()))
                        return 0 ;
                // check isSorted?
                flagIsSorted = 1 ;
                listIntIter = listInt->begin() ;
                for(int ii = 0; ii < k - 1; ii++)
                {
                        listNextIter = (++listIntIter)-- ;
                        if(*listIntIter > *listNextIter)
                        {
                                flagIsSorted = 0 ;
                                break ;
                        }
                        listIntIter++ ;
                }
                if(flagIsSorted)
                        return 1 ;
        }
        return 0 ;
}
int main()
{
        list<int>               listTest ;
        list<int>::iterator     listTestIter ;

        listTest.push_back(0) ;
        listTest.push_back(1) ;
        listTest.push_back(2) ;
        listTest.push_back(3) ;
        listTest.push_back(4) ;
        int val[5] = {1, 3, 2, 2, 4} ;
        int ret ;
        while(1)
        {
                listTestIter = listTest.begin() ;
                for(int ii = 0; ii < 3; ii++)
                {
                        printf("%d ", val[*listTestIter++]) ;
                }
                printf("\n") ;
                ret = next_k_combination(&listTest, 3) ;
                if(!ret)
                        break ;
        }
        return 1 ;
}
 
그럼, 즐프하세요~ ^^
 
전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호