/* 有四個互不相同的數字,輸出由其中三個不重復數字的全排列 思路:n位數,n%10可以得到最后一位,n/10可得前n-1個數;遞歸實現全排列 遞歸: 退出條件:low>=high;打印 循環:交換,遞歸調用函數,交換 */ #include <stdio.h> #include<string.h> void FullPermutation(int a[],int low,int high){ int i,temp; if(low>=high){ for(i=0;i<high;i++){ printf("%d",a[i]); } printf("\n"); }else{ for(i=low;i<high;i++){ if(i!=low){ temp=a[i]; a[i]=a[low]; a[low]=temp; } FullPermutation(a,low+1,high); if(i!=low){ temp=a[i]; a[i]=a[low]; a[low]=temp; } } } } void main(int argc,char *argv[]) { int num,i; int a[4]; scanf("%d",&num); a[3]=num%10; num=num/10; a[2]=num%10; num=num/10; a[1]=num%10; a[0]=num/10; FullPermutation(a, 0, 3); }
main() { int x,i=0,j,k,t; int a[4]; scanf("%d",&x); while(x){ a[i]=x%10; i++; x=x/10; } for(i=0;i<4;i++){ for(j=0;j<4;j++){ if(i!=j){ for(k=0;k<4;k++){ if(k!=i&&k!=j){ for(t=0;t<4;t++){ if(t!=i&&t!=j&&t!=k){ printf("%d%d%d\n",a[j],a[k],a[t]); } } } } } } } }
#include<stdio.h> #include<malloc.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<string.h> #include <iostream> void dfs(int* nums, int numsSize,int *used,int depth,int** rs,int *path,int *returnSize,int **returnColumnSizes){ int i; if(depth==numsSize){ rs[*returnSize]=(int*)malloc(sizeof(int)*depth); for(i=0;i<depth;i++){ printf("%d ",path[i]); rs[*returnSize][i]=path[i]; } printf("\n"); returnColumnSizes[0][*returnSize]=depth; *returnSize++; return; } for(i=0;i<numsSize;i++){ if(used[i]) continue; path[depth]=nums[i]; used[i]=1; dfs(nums,numsSize,used,depth+1,rs,path,returnSize,returnColumnSizes); used[i]=0; } } int** permute(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){ if(nums==NULL){ return NULL; } int **rs=(int**)malloc(sizeof(int*)*1000),*path=(int*)malloc(sizeof(int*)*1000); int *used=(int*)calloc(sizeof(int),numsSize); returnColumnSizes[0]=(int*)malloc(sizeof(int)*1000); *returnSize=0; dfs(nums,numsSize,used,0,rs,path,returnSize,returnColumnSizes); return rs; } int main() { int nums[]={1,2,3},target=3,*returnSize,**returnColumnSizes,numsSize=3; returnSize=(int*)malloc(sizeof(int)*1000); returnColumnSizes=(int**)malloc(sizeof(int*)*1000); int **rs=permute(nums, numsSize, returnSize, returnColumnSizes); return 0; }
注意:malloc與calloc的區別:
calloc在分配內存空間后,會被初始化為0;而malloc在分配內存空間后,會被隨機初始化。
本題中,如果used數組采用malloc,在if判斷句中跳過,這個bug,實在沒想到自己能犯。。。
#include<stdio.h> #include<math.h> #include<malloc.h> #include<string.h> #include<stdlib.h> #include <time.h> void FullPermutation(int *num,int n,int row,int *path,int depth,int *used){ /* num-原數組 n-原數組長度 row-回溯的層數 path-記錄回溯的節點 depth-記錄回溯的節點的長度 used-判斷回溯節點是否被使用和釋放 */ int i; if(depth==row){ for(i=0;i<depth;i++){ printf("%d ",path[i]); } printf("\n"); } for(i=0;i<n;i++){ if(used[i]==1) continue; used[i]=1; path[depth]=num[i]; FullPermutation(num,n,row,path,depth+1,used); used[i]=0; } } main() { int n=0,a,num[100]; scanf("%d",&a); while(a){ num[n]=a%10; a/=10; n++; } int *path=(int*)malloc(sizeof(int)),depth=0; int *used=(int*)calloc(sizeof(int),0); FullPermutation(num,n,3,path,depth,used); }