알고리즘 노트 연습

20168 단어 알고리즘 노트

알고리즘 노트 연습 문제 모음집


링크

제목


제목 묘사 배열과 조합은 자주 사용하는 수학 방법이다.먼저 정수(1<=n<==10), 예를 들어 n=3, 모든 조합을 주고 사전순으로 출력합니다.
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1 

정수 n 입력 (1<=n<=10)
출력 출력 모든 정렬
모든 줄을 한 줄로 배열하고, 인접한 두 수는 공백으로 구분한다. (마지막 수 뒤에는 공백이 없다)
샘플 입력
3

샘플 출력
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

생각

  • 반복 버전 사고방식: 알고리즘 노트 P115
  • 교체 버전의 사고방식: Next lexicographical permutation algorithm, 이 블로그는 예와 함께 매우 명확하게 설명했습니다. 저는 한 번 보고 코드를 실현했습니다. 강력히 추천합니다!
  • 라이브러리 함수next_permutation 버전: std::next_permutation

  • 코드


    반복 버전

    #include 
    #include 
    using namespace std;
    int n;
    vector<int> ans(11);
    vector<bool> hashTable(11, false);
    void DFS(int index) {
    	if (index > n) {
    		for (int i = 1; i <= n; ++i) {
    			if (i != 1)
    				putchar(' ');
    			printf("%d", ans[i]);
    		}
    		putchar('
    '
    ); return; } for (int i = 1; i <= n; ++i) { if (hashTable[i] == false) { ans[index] = i; hashTable[i] = true; DFS(index + 1); hashTable[i] = false; } } } int main() { while(scanf("%d", &n) != EOF) DFS(1); return 0; }

    교체 버전

    #include 
    #include 
    #include 
    using namespace std;
    bool myNextPermutation(vector<int>& nums) {
    	int pivot, pos;
    	for (pivot = nums.size() - 1; pivot > 0 && nums[pivot - 1] >= nums[pivot]; --pivot)
    		continue;
    	if (pivot == 0)
    		return false;
    	--pivot;
    	for (pos = pivot; pos < nums.size() - 1 && nums[pos + 1] >= nums[pivot]; ++pos)
    		continue;
    	swap(nums[pivot], nums[pos]); 
    	reverse(nums.begin() + pivot + 1, nums.end());
    	return true; 
    } 
    int main() {
    	int n;
    	while (scanf("%d", &n) != EOF) {
    		vector<int> nums(n);
    		for (int i = 1; i <= n; ++i)
    			nums[i - 1] = i;
    		do {
    			for (int i = 0; i < n; ++i) {
    				if (i > 0)
    					putchar(' ');
    				printf("%d", nums[i]); 
    			}
    			putchar('
    '
    ); } while (myNextPermutation(nums)); } return 0; }

    라이브러리 함수next_permutation 버전

    #include 
    #include 
    #include 
    using namespace std;
    int main() {
    	int n;
    	while (scanf("%d", &n) != EOF) {
    		vector<int> nums(n);
    		for (int i = 1; i <= n; ++i)
    			nums[i - 1] = i;
    		do {
    			for (int i = 0; i < n; ++i) {
    				if (i > 0)
    					putchar(' ');
    				printf("%d", nums[i]); 
    			}
    			putchar('
    '
    ); } while (next_permutation(nums.begin(), nums.end())); } return 0; }

    좋은 웹페이지 즐겨찾기