POJ 1674

来源:互联网 发布:pkpm钢结构计算软件 编辑:程序博客网 时间:2024/06/05 18:34
题意:给一串顺序打乱的数字,要求输出:将这串数字变为从小到大顺序的最少交换次数。
复制搜索
复制搜索

思路:输入完一串数字后,如果该位置上的数字与该位置号不相同,交换该位置上的数字与该位置上的数字的位置号上的数字(重复操作,直到该位置上的数字与该位置号相同为止)。即:
while(a[i]!=i){swap(a[i],a[a[i]]);count++;}

代码:
#include<iostream>
using namespace std;
int main()
{
  int *a,count,i,n,n0;
  cin>>n;
  while(n--)
  {
     count=0;
     cin>>n0;
     a=new int[n0+1];
     for(i=1;i<n0+1;i++)
         cin>>a[i];
     for(i=1;i<n0+1;i++)
     {
         while(a[i]!=i)
         {
            swap(a[i],a[a[i]]);
            count++;
         }
     }
     cout<<count<<endl;
     delete []a;
  }
  return 0;
}

原创粉丝点击