Balls
题目描述
你有若干个彩球排成一列,你可以交换相邻的两个球。 如果出现含被交换球的3个或者以上的的同颜色彩球,那么这些彩球就会消失,右边的彩球会向左边靠拢填满空间。 现在给你一个操作的序列,请依次输出每次操作后的彩球序列。
输入
第一行是一个整数T(1≤T≤100),表示样例的个数。 每个样例包含两行,第一行是一个字符串,长度不超过30,只含大写字母'A'-'C',表示不同字母表示不同颜色的球。第二行开始是一个整数n(1≤n≤10),表示操作的个数,以后n个整数ai表示将ai和ai+1交换。输入数据保证是合法的操作。
输出
每个样例的每行输出一个操作后彩球的状况,每个样例最后输出一个空行。
样例输入
4 AABABBB 1 3 AAAABBBBC 2 4 4 AAAAAA 1 2 AABAABBB 2 3 1样例输出
Over AAABABBBC C Over BABBB A
一定要看清题目:包含这两个被交换球 的连续三个 及 以上
因为要包含这两个球,直接从第一个球开始遍历较难实现,故采取从被包含球的左右两边计数的方法来判断
思路:先交换,然后分别对这两个球判断是否满足条件。若满足条件,则将连续的球记为‘0’,表示被消去了。然后把未消去的球依次放入新的数组,达到移位的目的,如果余下0个就输出None,否则输出该字符串。最后把该字符串赋给原字符串,达到更新的目的。
#include <stdio.h>
#include <string.h>
void Flag(char str[],int k);
int main (){
int T;
char t;
int n,m;
int i;
char str[31]={0};
scanf ("%d",&T);
while (T--){
scanf ("%s",str);
scanf ("%d",&n);
while (n--){
int j=0;
char str2[31]={0};
scanf ("%d",&m);
//换位
t=str[m-1];
str[m-1]=str[m];
str[m]=t;
//消除,记‘0’为被消除了
Flag(str,m-1);
Flag(str,m);
//把不为0的写入另一个数组使得移位
for (i=0;i<strlen(str);i++){
if (str[i]!='0'){
str2[j]=str[i];
j++;
}
}
//输出
if (j==0) printf ("Over\n");
else printf ("%s\n",str2);
strcpy(str,str2);//数组更新
}
puts("");//空行
}
return 0;
}
//函数功能:判断含有str【m】和str【m-1】的连续彩球是否有3个以上
void Flag(char str[],int k){
int i;
int cnt1=0,cnt2=0;
for (i=k-1;i>=0;i--){//向左计数 (不包括自己)
if (str[i]==str[k]) cnt1++;
else break;
}
for (i=k+1;i<strlen(str);i++){//向右计数(不包括自己)
if (str[i]==str[k]) cnt2++;
else break;
}
if (cnt1+cnt2>=2){//判断是否满足消除条件 //(除去自己有两个就行了)
for (i=cnt1;i>=0;i--){//包括自己,向左消除
str[k-i]='0';
}
for (i=1;i<=cnt2;i++){//除去自己,向右消除
str[k+i]='0';
}
}
}