UVA_331
本来打算先用BFS找到最少的交换次数,但发现情况种数太多,数组放不下,后来发现原来用冒泡法排序的过程对应的就是最少的交换次数。
得到最少的交换次数之后,只要限定深搜的层数,然后递归寻找一共有多少种交换方案即可。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int a[5],target[5],num,n,ans;
void dfs(int cur,int p[])
{
int i,k,q[5];
if(cur==num)
{
if(memcmp(p,target,sizeof(target))==0)
ans++;
return;
}
for(i=0;i<n-1;i++)
{
memcpy(q,p,sizeof(q));
k=q[i];
q[i]=q[i+1];
q[i+1]=k;
dfs(cur+1,q);
}
}
int main()
{
int i,j,k,t,front,rear;
t=0;
while(1)
{
scanf("%d",&n);
if(n==0)
break;
memset(a,0,sizeof(a));
for(i=0;i<n;i++)
scanf("%d",&a[i]);
memcpy(target,a,sizeof(a));
num=0;
for(i=0;i<n;i++)
for(j=n-1;j>i;j--)
if(target[j]<target[j-1])
{
k=target[j];
target[j]=target[j-1];
target[j-1]=k;
num++;
}
if(num==0)
{
printf("There are 0 swap maps for input data set %d.\n",++t);
continue;
}
ans=0;
dfs(0,a);
printf("There are %d swap maps for input data set %d.\n",ans,++t);
}
return 0;
}