移动小球

原题地址

转载来源:https://blog.csdn.net/air_one/article/details/12683355

移动小球

时间限制(普通/Java):1000MS/3000MS          运行内存限制:65536KByte
总提交:760            测试通过:88

描述

 

你有一些小球,从左到右依次编号为1,2,3,…,n,如下图所示:

你可以执行两种指令。其中A X Y表示把小球X移动到小球Y左边,B X Y表示把小球X移动到小球Y右边。指令保证合法,即X不等于Y。
例如,在初始状态下执行A 1 4后,小球1被移动到小球4的左边,如下图所示:

如果再执行B 3 5,结点3将会移到5的右边,如下图所示:

 

输入

输入小球个数n。指令条数m和m条指令,注意,1≤n≤500000,0≤m≤100000。

输出

从左到右输出最后的小球序列。

样例输入

6 2
A 1 4
B 3 5

样例输出

2 1 4 5 3 6

题目来源

刘汝佳《算法竞赛入门经典》

这题比较坑,数据输入量太大,用cin会超时,用scanf还可以,这是我第一次遇到这种情况。

 

题解可以看刘汝佳的书。

 

#include<stdio.h>
#include<stdlib.h>
 
#define MAXN  500005
 
int lft[MAXN],rgt[MAXN];
 
int main()
{
  int p,q,i,n,m;
  char type[2];
  scanf("%d%d",&n,&m);
  for(i = 0; i <= n+1; i++)
  {
    lft[i] = i-1;
    rgt[i] = i+1;
  }
  for(i = 0; i < m; i++)
  {
    scanf("%s%d%d",type,&p,&q);
    rgt[lft[p]] = rgt[p];
    lft[rgt[p]] = lft[p];
    if(type[0] == 'A')
    {
      rgt[lft[q]] = p;
      lft[p] = lft[q];
      lft[q] = p;
      rgt[p] = q;
    }
    else
    {
      lft[rgt[q]] = p;
      rgt[p] = rgt[q];
      rgt[q] = p;
      lft[p] = q;
    }
  }
  int front = rgt[0];
  while(rgt[front] != n+1)
  {
    printf("%d ",front);
    front = rgt[front];
  }
  printf("%d\n",front);
  return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Python的pygame库来实现利用方向键控制移动小球的效果。下面是一个简单的示例代码: ```python import pygame pygame.init() # 设置窗口大小和标题 screen = pygame.display.set_mode((400, 400)) pygame.display.set_caption("Move Ball") # 定义小球的初始位置和速度 ball_pos = [200, 200] ball_speed = [0, 0] # 循环监听事件 while True: for event in pygame.event.get(): # 监听关闭窗口事件 if event.type == pygame.QUIT: pygame.quit() exit() # 监听按键事件 elif event.type == pygame.KEYDOWN: if event.key == pygame.K_UP: ball_speed[1] = -5 elif event.key == pygame.K_DOWN: ball_speed[1] = 5 elif event.key == pygame.K_LEFT: ball_speed[0] = -5 elif event.key == pygame.K_RIGHT: ball_speed[0] = 5 elif event.type == pygame.KEYUP: if event.key == pygame.K_UP or event.key == pygame.K_DOWN: ball_speed[1] = 0 elif event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT: ball_speed[0] = 0 # 更新小球位置 ball_pos[0] += ball_speed[0] ball_pos[1] += ball_speed[1] # 绘制小球和背景 screen.fill((255, 255, 255)) pygame.draw.circle(screen, (255, 0, 0), ball_pos, 20) pygame.display.flip() ``` 在这个示例中,我们首先初始化pygame库,并设置了窗口的大小和标题。然后定义了小球的初始位置和速度。 在主循环中,我们循环监听事件,如果是关闭窗口事件,就退出程序;如果是按键事件,就根据按下的方向键来修改小球的速度;如果是松开方向键事件,就将相应方向的速度设为0。最后,我们根据小球的速度更新小球的位置,并在屏幕上绘制出小球和背景。使用`pygame.display.flip()`函数来更新屏幕上的显示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值