/*
移动小球
时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte
总提交:202 测试通过:46
描述
你有一些小球,从左到右依次编号为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
题目来源
刘汝佳《算法竞赛入门经典》
移动小球
时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte
总提交:202 测试通过:46
描述
你有一些小球,从左到右依次编号为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 <iostream>
using namespace std;
typedef struct ball
{
int num;
ball *next;
}ball,*pball;
pball create(int n)
{
pball head,p;
head=new ball;
p=new ball;
head->num=0;
head->next=p;
p->num=1;
for(int i=2;i<=n;i++)
{
pball q=new ball;
q->num=i;
p->next=q;
p=q;
}
return head;
}
void left(pball head,int a,int b)
{
pball p=new ball;
pball q=new ball;
pball t=new ball;
pball w=new ball;
p=head;
while(p->num!=a)
{
t=p;
p=p->next;
}
t->next=p->next;
q=p;
for(int i=0;i<b-a-1;i++)
{
p=p->next;
}
w=p->next;
p->next=q;
q->next=w;
}
void right(pball head,int a,int b)
{
pball p=new ball;
pball q=new ball;
pball t=new ball;
pball w=new ball;
p=head;
while(p->num!=a)
{
t=p;
p=p->next;
}
q=p;
t->next=p->next;
while(p->num!=b)
p=p->next;
w=p->next;
p->next=q;
q->next=w;
}
int main()
{
int n,num,a,b,i;
char ch;
cin>>n;
pball head;
head=create(n);
cout<<"请出入要执行的操作次数"<<endl;
cin>>num;
for(i=0;i<num;i++)
{
cout<<"请输入要执行的操作";
cin>>ch;
cin>>a>>b;
switch(ch)
{
case 'A':
left(head,a,b); continue;
case 'B':
right(head,a,b); continue;
}
}
for(i=0;i<n;i++)
{
cout<<head->next->num;;
head=head->next;
}
return 0;
}