哈工大2013年校赛-小球移动

小球移动
Time Limit: 1000 MS Memory Limit: 32768 K
Total Submit: 56(11 users) Total Accepted: 13(10 users) Rating:  Special Judge: No
Description
给你n个小球,从左到右编号依次为1,2,3,4,5,6.........n,并规定小球1的左边的球号为n,小球n的右边的球号为1.现在有以下3种操作:A x y表示把编号为x小球移动到编号为y的小球的左边,B x y表示把编号为x小球移动到编号为y的小球的右边,Q 1 m为询问编号为m的小球右边的球号,Q 0 m为询问编号为m的小球左边的球号。
Input
第一行有一个整数n(0<n<10000),表示有n组测试数据,随后每一组测试数据第一行是两个整数N,M,其中N表示球的个数(1<N<10000),M表示操作的的次数(0<M<10000)。
随后的M行,每行有三个数 s x y,s表示操作的类型,x,y为小球号。当s为Q时,若x为1,则询问小球y右边的球号,x为0,则询问小球y左边的球号。
Output
输出每次询问的球号。
Sample Input
1
6 3
A 1 4
B 3 5
Q 1 5
Sample Output
3

#include<stdio.h>
#include<stdlib.h>

typedef struct node
{
int num;
struct node *next,*front;
}*Linklist ,LNode;

Linklist push(int N,LNode *local[])
{
Linklist L,p,q;
L=(Linklist )malloc(sizeof(LNode));
L->next=NULL;
q=L;
local[0]=L;
for(int i=1;i<=N;++i)
{
p=(Linklist )malloc(sizeof(LNode));
p->num=i;
p->next=q->next;
q->next=p;
p->front=q;
q=q->next;
local[i]=p;
}
q->next=L->next;
L->next->front=q;
return L;
}
void move(Linklist L,int x,int y,LNode *local[],int g)
{
if(x==y)
return ;
Linklist p,q,l,ne;
l=local[x];
p=l->front;
q=local[y];
if(g==0&&l->front->num==y)
return ;
if(g)
{
if(q->front->num==x)
return ;
q=q->front;
}
p->next=p->next->next;
p->next->front=p;
free(l);
ne=(Linklist )malloc(sizeof(LNode));
ne->num=x;
ne->next=q->next;
q->next=ne;
ne->next->front=ne;
ne->front=q;
local[x]=ne;
}

int ques(Linklist L,LNode *local[], int f ,int s)
{
Linklist p;
if(f==0)
{
p=local[s];
p=p->front;
return p->num;
}
else if(f==1)
{
p=local[s];
p=p->next;
return p->num;
}

}
void output(Linklist L)
{
Linklist p;
p=L->next;
while(p!=NULL)
{
printf("%d ",p->num);
p=p->next;
}
printf("\n");
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
Linklist L;
LNode *local[10005];
int N,M;
scanf("%d %d",&N,&M);
L = push(N,local);
while( M-- )
{
getchar();
char op;
int oper1, oper2;
scanf("%c %d %d",&op, &oper1, &oper2);
switch( op )
{
case 'A':
move(L,oper1,oper2,local,1);
break;
case 'B':
move(L,oper1,oper2,local,0);
// output(L);
break;
case 'Q':
int answer=ques(L,local,oper1,oper2);
printf("%d\n",answer);
break;
}
// output(L);
}
}
return 0;
}

 

 

posted @ 2013-03-17 21:52  xiaxiaosheng  阅读(132)  评论(0)    收藏  举报