回溯即可(注意题意是只能交换相邻的两个元素)。
代码如下:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
using namespace std;
int a[6], b[6], cct, fct, n;
void dfs(int cur, int fi)
{
if(cur >= fct)
{
for(int i = 0; i < n; i++)
if(a[i] != b[i])
return ;
++cct;
return ;
}
for(int i = 0; i < n - 1; i++)
if(fi != i) // 剪枝,去掉上一次交换和这一次交换重复交换的情况
{
swap(a[i], a[i + 1]);
dfs(cur + 1, i);
swap(a[i], a[i + 1]);
}
}
void bubble_sort()
{
int flag;
for(int i = 0; i < n; i++)
{
flag = 0;
for(int j = 0; j < n - i - 1; j++)
if(b[j] > b[j + 1])
{
int t = b[j];
b[j] = b[j + 1];
b[j + 1] = t;
++fct;
flag = 1;
}
if(!flag)
break;
}
}
int main()
{
#ifdef test
freopen("sample.txt", "r", stdin);
#endif
int num = 0;
while(scanf("%d", &n),n)
{
fct = cct = 0;
for(int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
b[i] = a[i];
}
bubble_sort();
if(fct)
dfs(0, -1);
printf("There are %d swap maps for input data set %d.\n", cct, ++num);
}
return 0;
}