【题目描述】
兰姐姐是来自火星的女王。相信你们一定对兰姐姐不熟悉,她统领整个火星,在各方面拥有最高权力。很久很久以前,兰爸爸是火星的国王,去世以后,两个女儿争夺王位。火星上最聪明的人是辣椒酱,他帮助兰姐姐夺得了王位,而兰姐姐的姐姐Horse没有得到王位,便离开火星前往地球修行。
几年后,兰姐姐越来越思念姐姐,便决定到地球上找姐姐。
今天,她找到了自己失散已久的姐姐Horse的家,但是要进门就必须答对一个大难题,作为一个大犇犇犇,她很快就解出来了,你行吗?
题目是这样的:
现在有一个序列a,a的长度为n,一开始a[i]=i(1≤i≤n),现在有m个操作,每个操作的格式是这样的:x y表示把当前的a[x]与a[y]交换。我们把这m个操作叫做一轮操作,现在问,在经过多少轮操作之后,序列a又会回到原来的样子(原来的样子就是指a[i]=i(1≤i≤n))
【输入格式】
第一行,两个整数n,m,n表示a的长度,m表示操作数
接下来m行,每行一个操作x y,表示把当前的ax与ay交换保证(1≤x,y≤n)
【输出格式】
只有一个数,表示在经过多少轮之后,序列a又会回到原来的样子
【样例输入1】
4 4
1 4
3 4
2 3
1 4
【样例输出1】
3
【样例输入2】
5 3
1 2
2 3
4 5
【样例输出2】
6
思路:我们可以把一次操作弄成一次循环,并且用b[ ]数组来记录初始定义的值,用于z轮操作后与a[ ]进行对比,初始值可以为b[1]=1,b[2]=2。若对比成功则输出,失败则重来。
程序:
#include<stdio.h>
int main()
{
int q,p=0,i=1,n,m,z=0;
int x[100],y[100];/*x,y为操作数*/
int a[500],b[500];/*a为一个序列,b用来记录初始值*/
scanf("%d%d",&n,&m);
for(i=1;i<=m;++i)
{
scanf("%d%d",&x[i],&y[i]);
}
for(i=1;i<=n;++i)/*为初始的a序列里的n个数打上初始数据*/
{
a[i]=i;
b[i]=i;
}
for(i=1;i<=m;i++)/*一轮操作*/
{
q=a[x[i]];
a[x[i]]=a[y[i]];
a[y[i]]=q;
if(i==m)/*一轮操作后*/
{
++z;/*z记录操作的轮数*/
for(i=1;i<=n;++i)/*检验每一个数是否与初始值一致*/
{
if(a[i]==b[i])
{
++p;
}
}
if(p==n)/*全部一致则输出*/
{
printf("%d",z);
break;
}
else /*不一致则重新进行操作*/
{
i=0;
p=0;
}
}
}
return 0;
}