你有一些小球,从左到右依次编号为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
样例输出
你可以执行两种指令。其中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 100000
typedef 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指向x
char type[5];
scanf("%d%d", &n, &m);//输入小球个数n和指令条数m
if(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;
}