XTU oj 1347 消消乐

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';
		}
	}
}

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值