思路很简单的暴力算法,通过flag数组判断该位置有没有到位,t记录换号的个数,如果等于n就退出循环,num记录交换次数,然后一直循环遍历即可,过程中每次交换判断下被换来的数是否刚好是要换走的数的位置,如果是的话t就加两次,相当于两个数刚好互换的那种情况
C++ 代码
define _CRT_SECURE_NO_WARNINGS 1
include[HTML_REMOVED]
include[HTML_REMOVED]
include [HTML_REMOVED]
include [HTML_REMOVED]
using namespace std;
int flag[10001];
int t = 0;
int num = 0;
int main()
{
int n;
scanf(“%d”, &n);
int a[10001];
for (int i = 1; i <= n; i) scanf(“%d”, &a[i]);
while (t != n)
{
for (int i = 1; i <= n;i)
{
if (a[i] != i)
{
if (a[a[i]] == i)
{
t;
flag[a[a[i]]] = 1;
}
flag[a[i]] = 1;
swap(a[i], a[a[i]]);
t;
num;
}
else if (flag[i] == 0)
{
flag[i] = 1;
t;
}
}
}
printf(“%d”, num);
return 0;
}