HDU-1716配列2(DFS)

10352 ワード

配列2
Time Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 15   Accepted Submission(s) : 12
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
Rayはまた数字の列に興味を持った:既存の4枚のカードは、この4枚のカードで多くの異なる4桁を並べることができて、小さいから大きい順にこれらの4桁を出力することを要求します.
Input
各グループのデータが1行を占め、4枚のカードの数字(0<=数字<=9)を表し、4枚のカードが0であれば入力が終了する.
Output
各カードグループに対して、この4枚のカードからなるすべての4桁を小さい順に出力し、千桁の数字は同じ行で、同じ行の4桁の間にスペースで区切られます.各グループの出力データ間には1行が空で、最後のグループのデータの後ろには空の行がありません.
Sample Input
1 2 3 4
1 1 2 3
0 1 2 3
0 0 0 0

Sample Output
1234 1243 1324 1342 1423 1432
2134 2143 2314 2341 2413 2431
3124 3142 3214 3241 3412 3421
4123 4132 4213 4231 4312 4321

1123 1132 1213 1231 1312 1321
2113 2131 2311
3112 3121 3211

1023 1032 1203 1230 1302 1320
2013 2031 2103 2130 2301 2310
3012 3021 3102 3120 3201 3210

Source
2007省試合合宿チーム練習試合(2)
 1 #include<stdio.h>
 2 #include<string.h>
 3 int vist[10000],a[10000]={0},mark[10000]={0};
 4 void dfs(int sum,int i)
 5 {
 6     int j;
 7     if(i>4)
 8     {
 9         if(mark[sum]==0)
10             mark[sum]=1;
11            return ;
12     }
13     for(j=1;j<=4;j++)
14       if(vist[j]==0)
15         {
16             vist[j]=1;
17             dfs(sum*10+a[j],i+1);
18             vist[j]=0;
19         }
20 }
21 int main()
22 {
23     int j,x1,x2,x3,x4,t,f=0,r,g,n,b;
24       while(~scanf("%d%d%d%d",&x1,&x2,&x3,&x4))
25       {
26           r=g=n=b=0;
27           if(x1==0&&x2==0&&x3==0&&x4==0)
28               break;
29           memset(vist,0,sizeof(vist));
30           memset(mark,0,sizeof(mark));
31           a[1]=x1;a[2]=x2;a[3]=x3;a[4]=x4;
32           dfs(0,1);
33           if(f==1)
34               printf("
"); 35 for(j=1000;j<=9999;j++) 36 { 37 if(mark[j]==1) 38 { 39 r=j/1000; 40 if(r>g&&b==1) 41 { 42 printf("
"); 43 n=0; 44 } 45 b=1; 46 g=r; 47 if(n==1) 48 printf(" "); 49 printf("%d",j); 50 n=1; 51 } 52 53 } 54 printf("
"); 55 f=1; 56 } 57 return 0; 58 } 59 60