【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 }