1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
| #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<set>
using namespace std;
bool newLine[10], firstLine;
void perm(int a[], bool visited[], int len, int b[], int idx) { if(idx == len) { if(b[0]!=0) { if(!newLine[b[0]]) { newLine[b[0]] = true; if(firstLine) { firstLine = false; } else printf("\n"); } else { printf(" "); } for(int i=0; i<len; i++) { printf("%d",b[i]); } } return; }
for(int i=0; i<len;) { if(!visited[i]) { visited[i]=true; b[idx]=a[i]; perm(a, visited, len, b, idx+1); visited[i]=false; i++; while(i<len && a[i]==a[i-1])i++; } else { i++; } } }
void enume(int a[]) { set<int> s; int t; bool flag = true; for(int i=0; i<4; i++) { for(int j=0; j<4; j++) { if(j==i)continue; for(int x=0; x<4; x++) { if(x==j||x==i)continue; for(int y=0; y<4; y++) { if(y==x || y==j ||y==i)continue; if(a[i]!=0) { t = a[i]*1000+a[j]*100+a[x]*10+a[y]; if(s.empty()) { printf("%d", t); s.insert(t); flag = false; } else if(s.find(t) == s.end()) { if(flag) { printf("%d", t); flag = false; } else printf(" %d", t); s.insert(t); } } } } } if(!flag)printf("\n"); flag = true; }
}
int main() { int a[4],b[4]; bool first = true, visited[4]; while(scanf("%d %d %d %d", &a[0], &a[1], &a[2], &a[3])) { if(a[0]==0 &&a[1]==0&&a[2]==0&&a[3]==0)break; sort(a, a+4); if(first) { first=false; } else { printf("\n"); } firstLine=true; memset(visited, 0, sizeof(visited)); memset(newLine, 0, sizeof(newLine)); perm(a, visited, 4, b, 0); printf("\n"); } return 0; }
|