C语言兰姐姐的姐姐

题目描述

兰姐姐是来自火星的女王。相信你们一定对兰姐姐不熟悉,她统领整个火星,在各方面拥有最高权力。很久很久以前,兰爸爸是火星的国王,去世以后,两个女儿争夺王位。火星上最聪明的人是辣椒酱,他帮助兰姐姐夺得了王位,而兰姐姐的姐姐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;
    
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值