现在的位置: 首页 > 综合 > 正文

1288 最佳路径

2012年09月26日 ⁄ 综合 ⁄ 共 637字 ⁄ 字号 评论关闭
 
描述

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

输入

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

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

输出

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

样例输入
1
6 
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;
			    else
					break;
			}

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

 

抱歉!评论已关闭.