xtu oj Balls
Balls
题目描述
你有若干个彩球排成一列,你可以交换相邻的两个球。 交换后,如果出现包含被交换彩球且长度大于等于3的连续相同颜色彩球,那么这些彩球就会消失,右边的彩球会向左边靠拢填满空间。 现在给你一个操作的序列,请依次输出每次操作后的彩球序列。
输入
输出
每个样例的每行输出一个操作后彩球的状况,如果所有的彩球都消失,输出”Over”。每个样例最后输出一个空行。
样例输入
4 AABABBB 1 3 AAAABBBBC 2 4 4 AAAAAA 1 2 AABAABBB 2 3 1
样例输出
OverAAABABBBC COverBABBB A
分两种情况讨论
1、交换球颜色一样 2、交换球颜色不一样
AC代码
#include<stdio.h>
#include<string.h>
int main(){int T;scanf("%d",&T);while(T--){char a[35]={};scanf("%s",a);int i,j,n,x,t,cnt,la=strlen(a);char tem;scanf("%d",&n);for(i=0;i<n;i++){scanf("%d",&x);//互换 tem=a[x-1];a[x-1]=a[x];a[x]=tem;//交换的元素相等 if(a[x]==a[x-1]){int cntR=1,cntL=1;cnt=0; for(j=x+1;j<la;j++){if(a[j]==a[x])cntR++;else break;}for(j=x-2;j>=0;j--){if(a[j]==a[x])cntL++;else break;}cnt=cntL+cntR;//后面的数向前移动 if(cnt>=3){t=x-cntL;for(j=x+cntR;j<la;j++){a[t]=a[j];t++;}la-=cnt;}} else{int cnt1=1,cnt2=1; //右数 for(j=x+1;j<la;j++){if(a[j]==a[x])cnt1++;else break;}if(cnt1>=3){t=x;for(j=x+cnt1;j<la;j++){a[t]=a[j];t++;}la-=cnt1;}//左数 for(j=x-2;j>=0;j--){if(a[j]==a[x-1])cnt2++;else break;}if(cnt2>=3){t=x-cnt2;for(j=x;j<la;j++){a[t]=a[j];t++;}la-=cnt2;}} if(la==0)printf("Over\n");else{for(j=0;j<la;j++){printf("%c",a[j]);}printf("\n");}}printf("\n"); }
}