赞
踩
输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba
- #include"stdafx.h"
- #include"iostream"
- #include <string.h>
- using namespace std;
-
-
- int count; //统计全排列的个数
-
- void swap(char *str, int a, int b)
- {
- char temp;
- temp = str[a];
- str[a] = str[b];
- str[b] = temp;
- }
-
- void permutation_process(char *str, int begin, int end) {
- int k;
-
- if (begin == end - 1) {
- cout<<"第"<<count++<<"个全排列"<<str<<endl;
- <span style="white-space:pre"> </span>}else {
- for (k = begin; k < end; k ++) {
- swap(str, k, begin);
- permutation_process(str, begin + 1, end);
- swap(str, k, begin);
- }
- }
- }
-
- int _tmain(int argc, _TCHAR* argv[])
- {
- <span style="white-space:pre"> </span>char str[7];
- <span style="white-space:pre"> </span>int i, len;
- <span style="white-space:pre"> </span>cin>>str;
- <span style="white-space:pre"> </span>count = 1;
- len = strlen(str);
- permutation_process(str, 0, len);
-
- return 0;
- }

下面这张图给出了递归的过程
- #include "stdafx.h"
- #include"iostream"
- #include <string.h>
- using namespace std;
- int count; //统计全排列的个数
-
- void swap(char *str, int a, int b)
- {
- char temp;
- temp = str[a];
- str[a] = str[b];
- str[b] = temp;
- }
-
- int is_swap(char *str, int begin, int k)
- {
- int i, flag;
- for (i = begin, flag = 1; i < k; i ++) {
- if (str[i] == str[k]) {
- flag = 0;
- break;
- }
- }
- return flag;
- }
-
- void permutation_process(char *str, int begin, int end) {
- int k;
- if (begin == end - 1) {
- cout<<"第"<<count++<<"个全排列"<<str<<endl;
- }else {
- <span style="white-space:pre"> </span> for (k = begin; k < end; k ++) {
- <span style="white-space:pre"> </span> if(is_swap(str, begin, k) ){
- <span style="white-space:pre"> </span>swap(str, k, begin);
- <span style="white-space:pre"> </span>permutation_process(str, begin + 1, end);
- <span style="white-space:pre"> </span>swap(str, k, begin);
- }
- }
- <span style="white-space:pre"> </span> }
- }
-
-
- int _tmain(int argc, _TCHAR* argv[])
- {
- int i, len;
- cin>>str;
- count = 1;
- len = strlen(str);
- permutation_process(str, 0, len);
- return 0;
- }

- //全排列非递归
- #include"stdafx.h"
- #include<iostream>
- #include<algorithm>
- #include<cstring>
- using namespace std;
- #include<assert.h>
-
- //反转区间
- void Reverse(char* pBegin , char* pEnd)
- {
- while(pBegin < pEnd)
- swap(*pBegin++ , *pEnd--);
- }
- //下一个排列
- bool Next_permutation(char a[])
- {
- assert(a);
- char *p , *q , *pFind;
- char *pEnd = a + strlen(a) - 1;
- if(a == pEnd)
- return false;
- p = pEnd;
- while(p != a)
- {
- q = p;
- p--;
- if(*p < *q) //找降序的相邻2数,前一个数即替换数
- {
- //从后向前找比替换点大的第一个数
- pFind = pEnd;
- while(*pFind < *p)
- --pFind;
- swap(*p , *pFind);
- //替换点后的数全部反转
- Reverse(q , pEnd);
- return true;
- }
- }
- Reverse(a , pEnd); //如果没有下一个排列,全部反转后返回false
- return false;
- }
-
- int cmp(const void *a,const void *b)
- {
- return int(*(char *)a - *(char *)b);
- }
- int main(void)
- {
- char str[] = "bac";
- int num = 1;
- qsort(str , strlen(str),sizeof(char),cmp);
- do
- {
- printf("第%d个排列\t%s\n",num++,str);
- }while(Next_permutation(str));
- return 0;
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。