#include <cstdio>
#include <algorithm>
int d[10];
// lexicographical_order: 11.888 ms
void lexicographical_order(const int size)
{
int tot = 1, i, j;
for (i = 0; i < size; i++) d[i] = i+1, tot *= i+1;
// for (i = 0; i < size; i++) printf("%d%c", d[i], i==size-1?'\n':' ');
while (--tot)
{
i = size - 2;
while (d[i] > d[i+1]) i--;
j = size - 1;
while (j != i) {
if (d[j] > d[i]) {
std::swap(d[j], d[i]);
break;
} else j--;
}
i++;
j = size - 1;
while (i < j) {
std::swap(d[i], d[j]);
i++; j--;
}
// for (i = 0; i < size; i++) printf("%d%c", d[i], i==size-1?'\n':' ');
}
}
// incremental_way: 87.111 ms (+n)
void incremental_way(const int size)
{
int p[10], tot = 1, i, j, k, l;
for (i = 0; i < size; i++) d[i] = i+1, tot *= i+1, p[i] = tot;
tot = 0;
// for (i = 0; i < size; i++) printf("%d%c", d[i], i==size-1?'\n':' ');
while (++tot < p[size-1])
{
i = 0;
while (tot % p[i+1] == 0) i++;
j = 0;
k = 0;
for (j = 0; j < size; j++) {
if (d[j] <= i+1) {
d[j] = i+2 - d[j];
k = j;
} else if (d[j] == i+2) {
std::swap(d[j], d[k]);
}
}
// for (i = 0; i < size; i++) printf("%d%c", d[i], i==size-1?'\n':' ');
}
}
// decremental_way: 5.057 ms
void decremental_way(const int size)
{
int tot = 1, i, j, k, l;
for (i = 0; i < size; i++) d[i] = i+1, tot *= i+1;
k = size - 1;
// for (i = 0; i < size; i++) printf("%d%c", d[i], i==size-1?'\n':' ');
while (--tot)
{
i = 0; while (d[i] + i == size) i++;
if (i) {
j = i; while (j < size) {
if (d[j] == size-i) d[j-i] = d[j-i-1], d[j-i-1] = d[j]; else d[j-i] = d[j];
j++;
}
j = i; while (j) d[size-j] = size-j+1, j--;
k = size - 1;
} else {
std::swap(d[k], d[k-1]);
k--;
}
// for (i = 0; i < size; i++) printf("%d%c", d[i], i==size-1?'\n':' ');
}
}
// neighbor_swap: 21.622 ms (+2n)
void neighbor_swap(const int size)
{
bool r[10];
int w[10], tot = 1, i, j, k, l, L, R;
for (i = 0; i < size; i++) d[i] = i+1, r[i] = false, w[i] = i, tot *= i+1;
// for (i = 0; i < size; i++) printf("%d%c", d[i], i==size-1?'\n':' ');
while (--tot)
{
i = size-1, L = 0, R = size-1;
while ((!r[i] && w[i] == L) || (r[i] && w[i] == R)) (r[i] ? R-- : L++), r[i--] ^= 1;
l = w[i];
j = l + (r[i] ? +1 : -1);
k = d[j] - 1;
std::swap(d[j], d[l]);
std::swap(w[i], w[k]);
// for (i = 0; i < size; i++) printf("%d%c", d[i], i==size-1?'\n':' ');
}
}
int main()
{
// lexicographical_order(10);
// incremental_way(10);
// decremental_way(10);
neighbor_swap(10);
return 0;
}
| Compilation | N/A | N/A | Compile OK | Score: N/A | 显示更多 |
| Testcase #1 | 21.614 ms | 8 KB | Wrong Answer | Score: 0 | 显示更多 |
| Testcase #2 | 21.627 ms | 8 KB | Wrong Answer | Score: 0 | 显示更多 |
| Testcase #3 | 21.627 ms | 8 KB | Wrong Answer | Score: 0 | 显示更多 |
| Testcase #4 | 21.577 ms | 8 KB | Wrong Answer | Score: 0 | 显示更多 |
| Testcase #5 | 21.579 ms | 8 KB | Wrong Answer | Score: 0 | 显示更多 |
| Testcase #6 | 21.579 ms | 8 KB | Wrong Answer | Score: 0 | 显示更多 |
| Testcase #7 | 21.585 ms | 8 KB | Wrong Answer | Score: 0 | 显示更多 |
| Testcase #8 | 21.599 ms | 8 KB | Wrong Answer | Score: 0 | 显示更多 |
| Testcase #9 | 21.595 ms | 8 KB | Wrong Answer | Score: 0 | 显示更多 |
| Testcase #10 | 21.59 ms | 8 KB | Wrong Answer | Score: 0 | 显示更多 |
| Testcase #11 | 21.592 ms | 8 KB | Wrong Answer | Score: 0 | 显示更多 |
| Testcase #12 | 21.579 ms | 8 KB | Wrong Answer | Score: 0 | 显示更多 |
| Testcase #13 | 21.581 ms | 8 KB | Wrong Answer | Score: 0 | 显示更多 |
| Testcase #14 | 21.628 ms | 8 KB | Wrong Answer | Score: 0 | 显示更多 |
| Testcase #15 | 21.62 ms | 8 KB | Wrong Answer | Score: 0 | 显示更多 |
| Testcase #16 | 21.588 ms | 8 KB | Wrong Answer | Score: 0 | 显示更多 |
| Testcase #17 | 21.578 ms | 8 KB | Wrong Answer | Score: 0 | 显示更多 |
| Testcase #18 | 21.598 ms | 8 KB | Wrong Answer | Score: 0 | 显示更多 |
| Testcase #19 | 21.585 ms | 8 KB | Wrong Answer | Score: 0 | 显示更多 |
| Testcase #20 | 21.608 ms | 8 KB | Wrong Answer | Score: 0 | 显示更多 |