移动小球

来源:互联网 发布:nc 发送数据 编辑:程序博客网 时间:2024/04/28 05:02
你有一些小球,从左到右依次编号为1,2,3,…,n,

你可以执行两种指令。其中A X Y表示把小球X移动到小球Y左边,B X Y表示把小球X移动到小球Y右边。指令保证合法,即X不等于Y。

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

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

样例输入

6 2
A 1 4
B 3 5

样例输出

2 1 4 5 3 6

# include<stdio.h># include<stdlib.h>#define MAXBALL 500000#define MAXCOM 100000typedef struct ball{int num;    struct ball * next;} Ball;int main(void){int n, m, x, y, i;Ball * head, *p, *q;Ball *px, *prex, *py, *prey;//prex指向x前面的那个数, px指向xchar type[5];scanf("%d%d", &n, &m);//输入小球个数n和指令条数mif(n>MAXBALL || m>MAXCOM){  printf("error!\n");  exit(1);}    head = (Ball*)malloc(sizeof(Ball));//建立顺序链表head->num = 0;head->next = NULL;q = head;for(i=0; i<n; i++){  p = (Ball*)malloc(sizeof(Ball));  p->num = i+1;  q->next = p;  q=p;}q->next = NULL;for(i=0; i<m; i++){prex = prey = head;px = prex->next;py = prey->next;scanf("%s%d%d", type,&x, &y);if(x==y){  printf("error~!\n");  exit(1);}else{   while(px->num != x) //找到x的位置,使px指向x   {     prex = px;     px = prex->next;   }   while(py->num != y)//找到y的位置,使py指向y   {     prey = py;     py = prey->next;   }   if(type[0]=='A') //按指令移动小球   {     prex->next = px->next; prey->next = px; px->next = py;   }   else if(type[0]=='B')   {     prex->next = px->next;     px->next = py->next;     py->next = px;   }}}    p = head->next;//输出移动后的结果while(p){  printf("%d ", p->num);  p = p->next;}    printf("\n");    while(head)//释放动态分配的内存{  p = head;  head = head->next;  free(p);}  return 0;}

随机指令生产器


# include<stdio.h># include<stdlib.h>//rand()和srand()需要# include<time.h> //time()需要int n = 100, m = 100000;double random() //生成[0,1]之间的均匀随机数{  return (double)rand() / RAND_MAX;}int random(int m) //生成[0, m-1]之间的均匀随机数{  return (int)(random()*(m-1)+0.5);}int main(void){srand(time(NULL));//初始化随机数种子    printf("%d %d\n", n, m);for(int i=0; i<m; i++){  if(rand()%2==0)  printf("A");  else  printf("B");//随机指令种类  int X, Y;  for(;;)  {    X = random(n)+1;    Y = random(n)+1;    if(X!=Y)break;//只有X和Y不相等才是合法的  }  printf(" %d %d\n", X, Y);}  return 0;}