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;
}

  

posted on 2011-09-05 18:12  Staginner  阅读(401)  评论(0编辑  收藏  举报