1288 最佳路径

来源:互联网 发布:java web ssm项目实例 编辑:程序博客网 时间:2024/06/04 23:58
 
描述

现有一个N! 个节点的图,每个节点的编号分别是编号(A1A2A3 …AN )序列的一个排列。对于任意两个节点S 和T ,如果T 的编号是由S 编号的首位与除首位外的编号中任一位交换所得,则S 和T 之间有一条连线。请设计一个算法,求从节点S 走到节点(A1A2A3 …AN )所需经过的最少边数。(N<=100)

输入

第一行为一个整数T,表示有T组测试数据。

对于每组测试数据:第一行是N ,第二行是节点S 的编号的下标(中间一个空格)。

输出

对于每组测试数据:输出一行,从S 到(A1A2A3 …AN )所经过的最少边数。

样例输入
16 4  6  5  3  1  2
样例输出
6

 

 

#include <stdio.h>main(){int number,te;int n;int a[101];int i;int sum;int temp;scanf("%d",&number);for(te=1;te<=number;te++){scanf("%d",&n);for(i=0;i<n;i++)scanf("%d",&a[i]);sum=0;while(1){for(i=0;i<n;i++){ if(a[i]==i+1)        continue;    elsebreak;}if(i==n)break;else{if(i==0){temp=a[a[i]-1];a[a[i]-1]=a[0];a[0]=temp;sum++;}else{temp=a[i];a[i]=a[0];a[0]=temp;sum++;}}}printf("%d\n",sum);}}