递归枚举可能的交换次序,只要每次都是把大的数字往后面换,交换的次数肯定是最小的,注意递归完成后状态的回复。
#include <stdio.h>
int arr[100];
int count;
int case_count;
bool is_in_order(int n)
{
bool f;
f = true;
for(int i=2; i<=n; i++)
if(arr[i] < arr[i-1])
{
f = false;
break;
}
return f;
}
void dfs(int n)
{
int i, t;
for(i=1; i<=n-1; i++)
{
if(arr[i]>arr[i+1])
{
t = arr[i];
arr[i] = arr[i+1];
arr[i+1] = t;
if(is_in_order(n))
count ++;
else
dfs(n);
t = arr[i];
arr[i] = arr[i+1];
arr[i+1] = t;
}
}
}
void func(int n)
{
count = 0;
dfs(n);
printf("There are %d swap maps for input data set %d.\n", count, case_count);
}
int main(void)
{
int n, i;
//freopen("input.dat", "r", stdin);
case_count = 0;
while(1)
{
scanf("%d", &n);
if(!n)
break;
for(i=1; i<=n; i++)
scanf("%d", arr+i);
case_count++;
func(n);
}
return 0;
}