【HDU】 1716 排列2

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1716

练习手感,没事儿玩玩倒是挺好的.... 没啥算法含量...

 

排列2
 1 #include <iostream>
 2 #include <cmath>
 3 #include <cstring>
 4 #include <string>
 5 #include <cstdio>
 6 #include <cstdlib>
 7 #include <algorithm>
 8 #include <iomanip>
 9 #define MAXN 1010
10 using namespace std;
11 int num[20], ans[30], cnt;
12 bool used[20];
13 
14 void DFS(int level, int mul)    //level: 0~3,表示4个数用到哪一个了;mul值记录4个值的组合情况
15 {
16     if(level==4){   //出口:level==4说明4个数的组合完毕,将mul记录到ans数组中去
17          ans[cnt++] = mul;
18          return ;
19     }
20     int i, j;
21     for(i=0; i<4; ++i)if(!used[i]){
22         if(level==0) if(!num[i]) continue;  //如果第一层(即组合最高位)为0,则continue掉;
23         used[i] = 1;
24         DFS(level+1, mul*10+num[i]);   //递归到下一层,mul值累加
25         used[i] = 0;           //回溯
26         while(num[i+1]==num[i])  i++;    //剪枝,如果是相同的数,就没有必要再dfs了
27     }
28 }
29 
30 int main()
31 {
32     int i, j=0, a, p, min;
33     while(scanf("%d %d %d %d",&num[0],&num[1],&num[2],&num[3])!=EOF){
34           if(!num[0] && !num[1] && !num[2] && !num[3]) break;
35           if(j) printf("\n");
36           else j=1;
37 
38           memset(used,0,sizeof(used));
39           sort(num,num+4);   //先进行升序排序
40           cnt = 0;
41           DFS(0,0);       
42           a = ans[0]/1000;
43           for(i=0; i<cnt; ++i){       //输出格式比较纠结的...
44                 if(i<cnt-1 && ans[i+1]/1000 != a || i==cnt-1) {  //控制换行:最后一个、最高位改变了;
45                      a = ans[i+1]/1000;
46                     printf("%d\n",ans[i]);
47                 }
48                 else printf("%d ",ans[i]);
49           }
50     }
51     return 0;
52 }
posted on 2012-08-15 20:23  Yuna_  阅读(74)  评论(0编辑  收藏  举报