算法训练-移动小球

Description
你有一些小球,从左到右依次编号为1,2,3,...,n. 你可以执行两种指令(1或者2)。
其中, 1 X Y表示把小球X移动到小球Y的左边, 2 X Y表示把小球X移动到小球Y右边。
指令保证合法,即X不等于Y。 例如,初始状态1,2,3,4,5,6的小球执行1 1 4后,小球1被移动到小球4的左边,
即2,3,1,4,5,6。如果再执行2 3 5,结点3将会移到5的右边,即2,1,4,5,3,6。  Input
第一行为一个整数t(0<t<10),表示测试用例个数。
每个测试用例的第一行为两个整数n(1<n<=500000)和m(0<m<100000),n表示小球的个数,m为指令条数,以下m行每行为一条指令。 
Output
为每个测试用例单独输出一行,从左到右输出最后序列,
每个数字后面跟一个空格。 
Sample Input
Copy sample input to clipboard
2
6 2
1 1 4
2 3 5
5
1
2 1 5 
Sample Output
2 1 4 5 3 6 
2 3 4 5 1

 

 

本题训练的是链表的思想,链表对于删除与插入还有数字顺序对调十分方便
(里面没有用指针,只用了结构体。比较好理解,指针目前不太会用)
AC代码:

#include<stdio.h>
struct mode
{
  int L,R;
  int num;
}a[2000];//结构体,L,R分别是a[i]的左边和右边的数,a[i].num是a[i]本身的值
void Move(int stap,int x,int y)
{
   if(stap==1)//模式1(将x移向y的左边)
   {
      a[a[x].R].L=a[x].L;//x的右边的左边等于x原来的左边
      a[a[x].L].R=a[x].R;//x的左边的右边等于x原来的右边
      a[x].L=a[y].L;//x的左边等于y原来的左边
      a[a[y].L].R=a[x].num;//y原来的左边的右边变成x
      a[x].R=a[y].num;//x的右边变成y
      a[y].L=a[x].num;//y的左边变成x
      return;
   }
   else
   if(stap==2)//模式2(将x移向y的右边)
   {
      a[a[x].R].L=a[x].L;//x的右边的左边等于x原来的左边
      a[a[x].L].R=a[x].R; //x左边的右边等于x原来的右边
      a[y].L=a[x].R;//y的左边等于x原来的右边
      a[x].L=a[y].num;//x的左边等于y
      a[x].R=a[y].R;//x的右边等于y原来的右边
      a[y].R=a[x].num;//y的右边等于x
      return;
   }

}
int main()
{
    int i,j,n,sum,m,stap,x,y,k,first;
    scanf("%d",&n);
    while(n--)
    {
       scanf("%d%d",&sum,&m);
       for(i=1;i<=sum;i++)//初始化数组
       {
           a[i].num=i;
           a[i].L=i-1;
           a[i].R=i+1;
       }
       while(m--)
       {
          scanf("%d %d %d",&stap,&x,&y);
          Move(stap,x,y);//进行调换
       }
       for(i=1;i<=sum;i++)
       {
          if(a[i].L==0)//谁的左边是0,谁第一个输出
          first=i;//标记第一个输出的数
       }
       k=0;
       while(k<=sum)
       {
           if(k==0)//第一次输出
           {
              //不输出左边的0(因为原来就没有o)
              printf("%d ",a[first].num);
              printf("%d ",a[first].R);
              k+=3;//下次的那个数没有计算,这里要加3而不是2
              first=a[first].R;
           }
           else
           {
               printf("%d ",a[first].R);
               k++;//每输出一个数k加一次,知道k满足数组的长度退出
               first=a[first].R;
           }
       }
       printf("\n");
    }
    return 0;
}

代码为原创,转载请注明出处!

时间: 2024-10-26 06:51:14

算法训练-移动小球的相关文章

蓝桥杯-算法训练 操作格子

算法训练 操作格子   时间限制:1.0s   内存限制:256.0MB        问题描述 有n个格子,从左到右放成一排,编号为1-n. 共有m次操作,有3种操作类型: 1.修改一个格子的权值, 2.求连续一段格子权值和, 3.求连续一段格子的最大值. 对于每个2.3操作输出你所求出的结果. 输入格式 第一行2个整数n,m. 接下来一行n个整数表示n个格子的初始权值. 接下来m行,每行3个整数p,x,y,p表示操作类型,p=1时表示修改格子x的权值为y,p=2时表示求区间[x,y]内格子权

蓝桥杯 算法训练 安慰奶牛

 算法训练 安慰奶牛   时间限制:1.0s   内存限制:256.0M 问题描述 Farmer John变得非常懒,他不想再继续维护供奶牛之间供通行的道路.道路被用来连接N个牧场,牧场被连续地编号为1到N.每一个牧场都是一个奶牛的家.FJ计划除去P条道路中尽可能多的道路,但是还要保持牧场之间 的连通性.你首先要决定那些道路是需要保留的N-1条道路.第j条双向道路连接了牧场Sj和Ej(1 <= Sj <= N; 1 <= Ej <= N; Sj != Ej),而且走完它需要Lj的时

蓝桥杯-算法训练51-Torry的困惑(基本型)

今天做这道题最初以为会用到什么数学公式,在思考后发现自己想多了. 思路主要两个: 1. 生成一个质数表,再按要求求值(本文就按此方法): 2.从小取到大,判断是否是质数,如果是就相乘,并构建计数器判断是否达到n个. 算法训练 Torry的困惑(基本型)   时间限制:1.0s   内存限制:512.0MB 问题描述 Torry从小喜爱数学.一天,老师告诉他,像2.3.5.7--这样的数叫做质数.Torry突然想到一个问题,前10.100.1000.10000--个质数的乘积是多少呢?他把这个问题

lift and throw-蓝桥杯-算法训练 Lift and Throw 求教各位大牛,谢谢各位

问题描述 蓝桥杯-算法训练 Lift and Throw 求教各位大牛,谢谢各位 问题描述 给定一条标有整点(1, 2, 3, ...)的射线. 定义两个点之间的距离为其下标之差的绝对值. Laharl, Etna, Flonne一开始在这条射线上不同的三个点, 他们希望其中某个人能够到达下标最大的点. 每个角色只能进行下面的3种操作, 且每种操作每人不能进行超过一次. 1.移动一定的距离 2.把另一个角色高举过头 3.将举在头上的角色扔出一段距离 每个角色有一个movement range参数

c语言-算法训练 最大的算式 用C语言怎么解决

问题描述 算法训练 最大的算式 用C语言怎么解决 问题描述 题目很简单,给出N个数字,不改变它们的相对位置,在中间加入K个乘号和N-K-1个加号,(括号随便加)使最终结果尽量大.因为乘号和加号一共就是N-1个了,所以恰好每两个相邻数字之间都有一个符号.例如: N=5,K=2,5个数字分别为1.2.3.4.5,可以加成: 1*2*(3+4+5)=24 1*(2+3)*(4+5)=45 (1*2+3)*(4+5)=45 -- 输入格式 输入文件共有二行,第一行为两个有空格隔开的整数,表示N和K,其中

蓝桥杯-算法训练2 最大最小公倍数

刚做了,蓝桥杯算法训练的最大最小公倍数一题,感觉考查的是数学了,哈哈. 时间限制:1.0s   内存限制:256.0MB 问题描述 已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少. 输入格式 输入一个正整数N. 输出格式 输出一个整数,表示你找到的最小公倍数. 样例输入 9 样例输出 504 数据规模与约定 1 <= N <= 10^6. 思路如下: 1. n是奇数,那就最大的三个数相乘 2. n是偶数,得分两种情况了, ①如果n不是3的倍数,那就s=n*(n-1)

string-JAVA算法训练 数列给定一个正整数k(3≤k≤15)

问题描述 JAVA算法训练 数列给定一个正整数k(3≤k≤15) ------------------题目------------------------------------------------------- 给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是: 1,3,4,9,10,12,13,- (该序列实际上就是:3^0,3^1,3^0+3^1,3^2,3^0+3^2,3^1+3^2,3^0+3^1+3

c语言-算法训练 未名湖边的烦恼 怎么用C语言解决

问题描述 算法训练 未名湖边的烦恼 怎么用C语言解决 问题描述 每年冬天,北大未名湖上都是滑冰的好地方.北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰鞋都不剩. 每天早上,租鞋窗口都会排起长龙,假设有还鞋的m个,有需要租鞋的n个.现在的问题是,这些人有多少种排法,可以避免出现体育组没有冰鞋可租的尴尬场面.(两个同样需求的人(比如都是租鞋或都是还鞋)交换位置是同一种排法) 输入格式 两个整数,表示m和n 输出格式 一个整数,表示队伍的排法的方案数. 样例输入 3 2 样例输出

新颖训练方法——用迭代投影算法训练神经网络

首发地址:https://yq.aliyun.com/articles/72738 作者介绍:Jesse Clark 研究相位恢复的物理学家.数据科学家,有着丰富的建设网站与设计手机应用的经验,在创业公司有着丰富的经验,对创业有着极大的热情.  Github: https://github.com/jn2clark Linkedin: http://www.linkedin.com/in/j3ss3cl4rk 相位恢复(PR)关心的是在给定幅度信息以及受到实空间限制下,找到复值函数(通常在傅立叶