一道简单题,用数组模拟链表即可。。。。开始wa了一次,主要是有些边界条件没有考虑好,改过后就ac了。。。。。题目:
移动小球
时间限制:1000 ms | 内存限制:65535 KB
难度:2
-
描述
-
给你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的小球左边的球号。
-
输入
-
第一行有一个整数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左边的球号。
输出 - 输出每次询问的球号 样例输入
-
1 6 3 A 1 4 B 3 5 Q 1 5
样例输出 -
3
-
第一行有一个整数n(0<n<10000),表示有n组测试数据,随后每一组测试数据第一行是两个整数N,M,其中N表示球的个数(1<N<10000),M表示操作的的次数(0<M<10000)
#include <iostream>
#include <string.h>
#include <cstdio>
using namespace std;
const int N=10010;
int value[N],leftt[N],rightt[N],n,m;
void init(){
for(int i=1;i<=n;++i){
value[i]=i;
leftt[i]=i-1;
rightt[i]=i+1;
}
leftt[1]=n;rightt[n]=1;
}
int main(){
//freopen("1.txt","r",stdin);
//freopen("2.txt","w",stdout);
int numcase;
scanf("%d",&numcase);
while(numcase--){
scanf("%d%d",&n,&m);
init();
char ch;
int a,b;
while(m--){
cin>>ch>>a>>b;
if(ch=='A'){
if(rightt[a]==b&&leftt[b]==a)continue;
int lefta=leftt[a];
int righta=rightt[a];
int leftb=leftt[b];
rightt[lefta]=righta;
leftt[righta]=lefta;
rightt[leftb]=a;
leftt[b]=a;
rightt[a]=b;
leftt[a]=leftb;
}
else if(ch=='B'){
if(leftt[a]==b&&rightt[b]==a)continue;
int lefta=leftt[a];
int righta=rightt[a];
int rightb=rightt[b];
rightt[lefta]=righta;
leftt[righta]=lefta;
leftt[rightb]=a;
rightt[b]=a;
leftt[a]=b;
rightt[a]=rightb;
}
else if(ch=='Q'){
if(a==1)
printf("%d\n",rightt[b]);
else
printf("%d\n",leftt[b]);
}
}
}
return 0;
}