求给定数组相邻元素的交换次数!简单的回溯!
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cctype>
#include<cstdlib>
#include<algorithm>
using namespace std;
int n,ans,minn;
int num[6];
inline bool IsAscend()
{
for(int i = 0;i < n-1;i++)
if(num[i] > num[i+1])
return false;
return true;
}
inline void SWAP(int a,int b)
{
int temp = num[a];
num[a] = num[b];
num[b] = temp;
}
void DFS()
{
bool flag = false;
for(int i = 0;i < n-1;i++)
if(num[i] > num[i+1])//只交换相邻相逆元素,得到交换次数必是最小的
{
flag = true;
SWAP(i,i+1);
DFS();
SWAP(i+1,i);
}
if(!flag) ans++;
}
int main()
{
freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
char ch;
int cases = 0;
while(scanf("%d",&n)==1 && n)
{
ans = 0;
minn = 999999;
for(int i = 0;i < n;i++)
scanf("%d",&num[i]);
if(!IsAscend())
DFS();
printf("There are %d swap maps for input data set %d.\n",ans,++cases);
}
return 0;
}