题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=1716
1 #include <cstdio> 2 #include <cmath> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 7 int a[4],vis[4],s[25]; 8 int t,c; 9 10 void dfs(int num) 11 { 12 if (num == 4) 13 { 14 if (c>=1000) 15 s[t++] = c; 16 return ; 17 } 18 for (int i=0; i<4; i++) 19 { 20 if (!vis[i]) //标记访问 21 { 22 vis[i] = 1; 23 c = c * 10 + a[i]; 24 dfs(num + 1); 25 vis[i] = 0; 26 c = (c - a[i]) / 10; 27 } 28 } 29 } 30 31 int main () 32 { 33 int flag = 0; 34 while (scanf ("%d%d%d%d",&a[0],&a[1],&a[2],&a[3])) 35 { 36 sort(a, a+4); 37 if (a[3] == 0) 38 break; 39 if (flag) 40 { 41 printf ("\n"); 42 } 43 flag = 1; 44 memset(vis, 0, sizeof(vis)); 45 t = c = 0; 46 dfs(0); 47 sort(s, s+t); 48 int temp; 49 printf ("%d",s[0]); 50 temp = s[0] / 1000; //记住千位数 51 for (int i=1; i<t; i++) 52 { 53 if (s[i] == s[i-1]) //因为排序过了,所以相同的四位数都在一起 54 continue ; 55 if (s[i] / 1000 != temp) //千位数不同,换行 56 { 57 printf ("\n%d",s[i]); 58 temp = s[i] / 1000; //同时记录新的千位数 59 } 60 else 61 { 62 printf (" %d",s[i]); 63 } 64 } 65 printf ("\n"); 66 } 67 return 0; 68 }
今天意外看到一位大神博客,用了一个next_permutation(a.begin(), a.end())函数,轻轻松松实现全排列。
附上大神博客链接和他的代码 : http://www.cnblogs.com/jackge/archive/2013/05/22/3093089.html
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 6 using namespace std; 7 8 int main(){ 9 10 //freopen("input.txt","r",stdin); 11 12 int a[5],tag=0; 13 while(scanf("%d%d%d%d",&a[0],&a[1],&a[2],&a[3])){ 14 if(a[0]==0 && a[1]==0 && a[2]==0 && a[3]==0) 15 break; 16 if(tag) 17 printf("\n"); 18 tag=1; 19 int flag=1,tmp; 20 do{ 21 if(a[0]==0) 22 continue; 23 if(flag){ 24 printf("%d%d%d%d",a[0],a[1],a[2],a[3]); 25 flag=0; 26 }else if(tmp==a[0]) 27 printf(" %d%d%d%d",a[0],a[1],a[2],a[3]); 28 else 29 printf("\n%d%d%d%d",a[0],a[1],a[2],a[3]); 30 tmp=a[0]; 31 }while(next_permutation(a,a+4)); 32 printf("\n"); 33 } 34 return 0; 35 }
原文:http://www.cnblogs.com/dxd-success/p/4172675.html