题目意思:给定一个无序的序列,要求找到一个交换次数最少的方案使得序列为有序列,然后再找到以该最少次数为方案的总数是多少,输出方案数
解题思路:根据冒泡排序的方法,我们将可以得到最少的交换次数,然后问我们在这个次数下的交换方式有几种。我们可以利用冒泡排序的思想,就是我们每一次递归下去的时候都从0这个点开始搜索,只要有递归就判断当前的序列是否排好序,如果序列排好那么ans++并且不再递归下去直接return,注意这里每一次递归回来还要把两个数交换回来
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <cctype> #include <algorithm> using namespace std; const int MAXN = 1000; int n, ans; int arr[5]; //判断函数 int judge() { for (int i = 0; i < n - 1; i++) { if (arr[i] > arr[i + 1]) return 0; } return 1; } //递归函数 void dfs() { if (judge()) { ++ans;//序列已经排好 return; } for (int k = 0; k < n - 1; k++) {//这里每一次都从0开始搜索 if (arr[k] > arr[k + 1]) { swap(arr[k], arr[k + 1]); dfs(); swap(arr[k], arr[k + 1]);//状态的回溯 } } } int main() { int cnt = 1; while (scanf("%d", &n) && n) { ans = 0; for (int i = 0; i < n; i++) scanf("%d", &arr[i]); if (!judge()) dfs(); printf("There are %d swap maps for input data set %d.\n", ans, cnt); ++cnt; } return 0; }