生活随笔
收集整理的這篇文章主要介紹了
算法设计与分析——递归与分治策略——全排列
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
算法設計與分析——遞歸與分治策略——全排列
全排列問題的解決是通過分治與遞歸思想來解決的
首先判斷是否遞歸到了最后一位,如果遞歸到了最后一位,則輸出他當前的全排列序列。
如果沒有到達最后一位,則循環的交換該第K個元素與其后面的所有元素,每次交換后立即進入遞歸程序,進入下一層的遞歸。
代碼1:
#include<iostream>
using namespace std
;
template <class Type>
void perm(Type
*list
,int k
,int m
)
{if(k
== m
){for(int i
=0;i
<=m
;i
++){cout
<<list
[i
]<<" ";} cout
<<endl
;}else{for(int i
=k
;i
<=m
;i
++){swap(list
[k
],list
[i
]);perm(list
,k
+1,m
);swap(list
[k
],list
[i
]);}}
}
int main()
{int n
;cout
<<"輸入需要進行全排列的數據長度:"<<endl
;cin
>>n
;int list
[n
];cout
<<"輸入需要進行全排列的數據:"<<endl
;for(int i
=0;i
<n
;i
++){cin
>>list
[i
];} cout
<<"輸出全排列的結果:"<<endl
; perm(list
,0,n
-1);return 0;}
#include<bits/stdc++.h>
using namespace std
;
int number
=0;
void arrange(vector
<int> &nums
,int left
,int right
)
{if(left
==right
){for(auto a
:nums
){cout
<< a
<< " ";}cout
<< endl
;number
++; }else{for (int i
= left
; i
<= right
; i
++){swap(nums
[left
], nums
[i
]);arrange(nums
, left
+ 1, right
);swap(nums
[left
], nums
[i
]);}}
}int main()
{vector
<int> nums
= {1,2,3};int count
= nums
.size()-1;arrange(nums
, 0,count
);cout
<<"全排列一共有"<<number
<<"個排列"<<endl
; system("pause");
}
總結
以上是生活随笔為你收集整理的算法设计与分析——递归与分治策略——全排列的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。