整體思路就是利用回溯的思想,也可認(rèn)為是深度優(yōu)先搜索

網(wǎng)頁設(shè)計(jì)是網(wǎng)站建設(shè)的前奏,好的網(wǎng)頁設(shè)計(jì)更深度的剖析產(chǎn)品和設(shè)計(jì)風(fēng)格定位,結(jié)合最新的網(wǎng)頁設(shè)計(jì)流行趨勢,與WVI應(yīng)用標(biāo)準(zhǔn),設(shè)計(jì)出具企業(yè)表現(xiàn)力,大器而深穩(wěn)的網(wǎng)站界面設(shè)。創(chuàng)新互聯(lián)公司成立于2013年,是成都網(wǎng)站建設(shè)公司:提供企業(yè)網(wǎng)站設(shè)計(jì),品牌網(wǎng)站設(shè)計(jì),營銷型企業(yè)網(wǎng)站建設(shè)方案,響應(yīng)式網(wǎng)站開發(fā),小程序開發(fā),專業(yè)建站公司做網(wǎng)站。
從字符串第一位idx=0開始,每次遞歸都從s[idx]之后選擇一個(gè)字符與s[idx]交換
因?yàn)榭赡苡兄貜?fù)字符,可使用哈希數(shù)組標(biāo)記當(dāng)前循環(huán)每個(gè)字符是否被選擇
因?yàn)樽址秶怀^ASCII碼,所以使用128空間的數(shù)組足夠用來標(biāo)記了
選擇好當(dāng)前字符s[i]并與s[idx]交換之后,遞歸調(diào)用繼續(xù)排列下一位s[idx+1]
注意這里要進(jìn)行回溯,即不選s[i]而選擇之后的某個(gè)字符交換到s[idx]
所以要將之前的s[i]與s[idx]交換過來,恢復(fù)原狀,才能循環(huán)判斷下一個(gè)選擇
具體代碼截圖如下:
運(yùn)行結(jié)果如下:
結(jié)果正確,望采納~
附源碼:
#include stdio.h
#include stdlib.h
#include string.h
#define MAXN 1000000 // 排列總數(shù)可能很多
int num = 0; // 記錄排列總數(shù)
char *res[MAXN] = {NULL}; // 指針數(shù)組保存排列結(jié)果
void swap(char *x, char *y) { // 交換兩個(gè)字符變量的內(nèi)容
char ch = *x;
*x = *y;
*y = ch;
}
void perm(char *s, int n, int idx) { // 回溯產(chǎn)生字符串全排列
if (idx == n) { // 已排列到字符串結(jié)尾
? res[num] = (char *)malloc(sizeof(char) * (n + 1));
? //printf("%s\n", s); // 輸出當(dāng)前排列
? strcpy(res[num], s); // 保存當(dāng)前排列
? num++; // 排列總數(shù)加1
? return;
}
int i, hash[128] = {0}; // 哈希數(shù)組,標(biāo)記每個(gè)字符是否被選擇
for (i = idx; i n; i++) {
? if (hash[s[i]] == 1)
? ? ? continue; // 跳過已被標(biāo)記過的重復(fù)字符
? hash[s[i]] = 1; // 選過的話在數(shù)組中標(biāo)記為1
? swap(s[idx], s[i]); // 選擇s[i]交換到s[idx]
? perm(s, n, idx + 1); // 遞歸,繼續(xù)s[idx+1]的選擇
? swap(s[idx], s[i]); // 回溯,當(dāng)前不選擇s[i],而選擇其他字符
}
}
int main() {
int n, i;
scanf("%d", n);
char *s = (char *)malloc(sizeof(char) * (n + 1));
scanf("%s", s);
perm(s, n, 0);
printf("一共有%d種排列:\n", num); // 輸出排列總數(shù)
for (i = 0; i num; i++) { // 輸出所有排列
? printf("%s\n", res[i]);
? free(res[i]); // 釋放內(nèi)存空間
}
free(s);
return 0;
}
#include?iostream
#include?stdio.h
#include?algorithm
using?namespace?std;
int?main()
{
int?num[4]={1,2,3,4};
do
{
printf("%c,%c,%c,%c\n",num[0]+'A'-1,num[1]+'A'-1,num[2]+'A'-1,num[3]+'A'-1);
}while(next_permutation(num,num+4));
return?0;
}
可以借助于stl模板中的next_permutation函數(shù),這個(gè)函數(shù)是按照字典序不停的取該序列的下一個(gè)序列,直到結(jié)束。然后輸出的時(shí)候講數(shù)字轉(zhuǎn)化為你要的字母即可。
例如 第一個(gè)序列是1,2,3,4,--》A,B,C,D
我給你舉兩個(gè)簡單的列子:題目:輸入三個(gè)整數(shù)x,y,z,請把這三個(gè)數(shù)由小到大輸出。 1.程序分析:我們想辦法把最小的數(shù)放到x上,先將x與y進(jìn)行比較,如果xy則將x與y的值進(jìn)行交換,然后再用x與z進(jìn)行比較,如果xz則將x與z的值進(jìn)行交換,這樣能使x最小。 2.程序源代碼: main() { int x,y,z,t; scanf("%d%d%d",x,y,z); if (xy) {t=x;x=y;y=t;} /*交換x,y的值*/ if(xz) {t=z;z=x;x=t;}/*交換x,z的值*/ if(yz) {t=y;y=z;z=t;}/*交換z,y的值*/ printf("small to big: %d %d %d\n",x,y,z); } 題目:有1、2、3、4個(gè)數(shù)字,能組成多少個(gè)互不相同且無重復(fù)數(shù)字的三位數(shù)?都是多少? 1.程序分析:可填在百位、十位、個(gè)位的數(shù)字都是1、2、3、4。組成所有的排列后再去掉不滿足條件的排列。 2.程序源代碼: main() { int i,j,k; printf("\n"); for(i=1;i5;i++)/*以下為三重循環(huán)*/ for(j=1;j5;j++) for (k=1;k5;k++) { if (i!=ki!=jj!=k) /*確保i、j、k三位互不相同*/ printf("%d,%d,%d\n",i,j,k); } } 你的問題很籠統(tǒng),根本就是讓人無從答起,我只是舉了其中幾個(gè)列子而已,如果你還是要執(zhí)著的話,那我的答案就是你所學(xué)的教材,你若能把你的書看懂了,你就不會在問這種問題了,
C語言版:
#includestdio.h
#includestdlib.h
#includestring.h
int?a[10],?book[10],?n,?k[10],?l;
void?dfs(int?step)
{
int?i?=?0;
if(step?==?l?+?1)
{
if(a[1]?!=?0)
{
for(i?=?1;?i?=?l;?i++)
{
printf("%d",?a[i]);
}
printf("\n");
}
return?;
}
for(i?=?0;?i??l;?i++)
{
if(book[k[i]]?==?0)
{
a[step]?=?k[i];
book[k[i]]?=?1;
dfs(step?+?1);
book[k[i]]?=?0;
}
}
}
int?main(void)
{
memset(k,?0,?sizeof(k));
memset(book,?0,?sizeof(book));
int?n;
scanf("%d",?n);
char?buf[15]?=?"";
sprintf(buf,?"%d",?n);
l?=?strlen(buf);
int?i?=?0;
for(i?=?0;?i??l;?i++)
k[i]?=?buf[i]?-?'0';
dfs(1);
system("pause");//如果通不過編譯就試著刪除這句話
return?0;
}
C++版:
#includecstdio
#includecstdlib
#includecstring
int?a[10],?book[10],?n,?k[10],?l;
void?dfs(int?step)
{
if(step?==?l?+?1)
{
if(a[1]?!=?0)
{
for(int?i?=?1;?i?=?l;?i++)
{
printf("%d",?a[i]);
}
printf("\n");
}
return?;
}
for(int?i?=?0;?i??l;?i++)
{
if(book[k[i]]?==?0)
{
a[step]?=?k[i];
book[k[i]]?=?1;
dfs(step?+?1);
book[k[i]]?=?0;
}
}
}
int?main(void)
{
memset(k,?0,?sizeof(k));
memset(book,?0,?sizeof(book));
int?n;
scanf("%d",?n);
char?buf[15]?=?"";
sprintf(buf,?"%d",?n);
l?=?strlen(buf);
for(int?i?=?0;?buf[i]?!=?'\0';?i++)
k[i]?=?buf[i]?-?'0';
dfs(1);
return?0;
}
當(dāng)前名稱:c語言函數(shù)輸出全排列 c語言實(shí)現(xiàn)排序
轉(zhuǎn)載注明:http://chinadenli.net/article10/dojgodo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、標(biāo)簽優(yōu)化、關(guān)鍵詞優(yōu)化、Google、面包屑導(dǎo)航、網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)