题意:给出n个数字,判断让相邻的两个数交换,最后形成从小到大的序列的次数最少的交换方案有几种。
题解:判断如果顺序不是从小到大就开始递归,从开头进行相邻的两个数交换,每交换形成一个从小到大的序列后,就将交换过的再还原,方案加一,然后继续从下一个数字开始交换,直到递归结束。
#include <stdio.h>
const int N = 10;
int n, s[N], ans;
int judge() {
for (int i = 0; i < n - 1; i++)
if (s[i] > s[i + 1])
return 0;
return 1;
}
void swap(int pos1, int pos2) {
int temp;
temp = s[pos1];
s[pos1] = s[pos2];
s[pos2] = temp;
}
void dfs() {
if (judge()) {
ans++;
return;
}
for (int i = 0; i < n - 1; i++)
if (s[i] > s[i + 1]) {
swap(i, i + 1);
dfs();
swap(i, i + 1);
}
}
int main() {
int t = 1;
while (scanf("%d", &n) && n) {
ans = 0;
for (int i = 0; i < n; i++)
scanf("%d", &s[i]);
if (!judge())
dfs();
printf("There are %d swap maps for input data set %d.\n", ans, t++);
}
return 0;
}