using namespace std; const int MAXN = 21; int find_first_of(int k, int h[]) { for (int i = k + 1; i <= 9; i++) if (h[i]) return i; return -1; } int find_min(int h[]) { for (int i = 0; i <= 9; i++) if (h[i]) return i; return -1; } int find_second(int h[]) { for (int i = 1; i <= 9; i++) if (h[i]) return i; return -1; } void find_minimal_k(int k, int a[], int h[], int A[], int n) { int i, j, m, t, first, second, tag, len = 1; for (i = 0; i first = find_min(h); second = find_second(h); while (k) { a[len++] = k % 10; k /= 10; } for (i = 1, j = len - 1; i t = a[i], a[i] = a[j], a[j] = t; for (tag = 0, i = 1; i if (!h[a[i]]) { for (j = i; j >= 1 && !tag; j--) if ((t = find_first_of(a[j], h)) != -1) for (tag = 1, a[j] = t, m = j + 1; m a[m] = first; if (j == 0) for (tag = 1, a[j] = second, m = j + 1; m a[m] = first; } } if (i == len) { for (j = len - 1; j >= 1 && !tag; j--) if ((t = find_first_of(a[j], h)) != -1) for (tag = 1, a[j] = t, m = j + 1; m a[m] = first; if (j == 0) for (tag = 1, a[j] = second, m = j + 1; m a[m] = first; } if (a[0]) cout < for (i = 1; i cout < int A[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; int a[MAXN], h[10]; memset(a, 0, sizeof(a)); memset(h, 0, sizeof(h)); find_minimal_k(123456789, a, h, A, 10); return 0; }