C: 祖玛游戏

 给你一个只含有小写字母的字符串s,请你从左至右在 s 中选择第一个 k 个相邻且相等的字母,并删除它们,使被删去的字符串的左侧和右侧连在一起。你需要对 s 重复进行无限次这样的删除操作,直到无法继续为止。在执行完所有删除操作后,输出最终得到的字符串。

输入
整数k和字符串s,(2<=k<=5,1<=|s|<=1000000)    

输出
输出执行完所有删除操作后最终得到的字符串。

样例输入
3
deeedbbcccbdaa

样例输出
aa

以下代码网络查找并由作者注释翻译,并无任何商业用途,仅供学习交流。

#include<bits/stdc++.h>
using namespace std;
typedef long long int ll; //数字变化从deeedbbcccbdaa
                              //到   ddbbbdaa
							  //到   dddaa
							  //到 aa 
const ll maxn = 1e6+10;
ll k;
ll n;
char str[maxn],str1[maxn];
int find1(ll x)
{                               
	ll s=1;                  //deeedbbcccbdaa 这段find1代码
	                        //第一次进入find1          //第一次相当于从a[0]分别和它后面两个判断是否相同 若相同一次则s+1 最多+2次,变成3 
	//cout<<x+k<<endl;        i<(x+k)(遍历3次的代码)   //第二次从a[1]分别和它后面两个判断是否相同 相同则+1 
	for(int i=x+1;i<(x+k);i++){                  //第三次从 a[2]分别和它后面两个判断是否相同 相同则+1 
	                                                                           // (i-x)<k(和后面两个判断是否相同的代码) 
		if(i>n)break;
		if(str[i]==str[x]&&(i-x)<k){
			//cout<<i<<" ";                    下一次进入find1 代码 第一次从a[1] 分别和它后面两个判断是否相同 若相同一次则s+1 最多+2次
			s++;                                                 //第二次从a[1]分别和它后面两个判断
		}                                                     //第三次从 a[2]分别和它后面两个判断是否相同 相同则+1
	}
	//cout<<s<<endl;	根据 
	if(s==k){
		return 1;
	}else{
		return 0;
	}
}
int main(){
	cin>>k;
	cin>>(str+1);//因为数组第一位为str[0],从str[1]开始输入值,方便使用
	n=strlen(str+1);
	ll cnt=0;

	while(1){//while结束循环的条件是!flag ==1时,即flag==0 找不到连续3个相同的字母时 
	
		ll flag=0;
		for(int i=1;i<=n;i++){
			
			if(find1(i))//若find1返回的是1,则存在需要连续删除的3个字母 
			             //若find1返回的是0 则不存在需要删除的3个字母 
			{          
				
				i=i+k-1;//改变i的值,使i在连续3个字母的后一位 
				flag=1;
				
			}else{ //如果返回是0,则直接将当前的字母放入新数组str1中 
			//  数组str1存放的是删除连续字母后的字母串 
				str1[++cnt]=str[i];
			}
		}
		
		if(!flag){//如果找不到终止条件(存在连续的3个相同字母) 
			break;//结束当前while循环 
		}
		for(int i=1;i<=cnt;i++){//将str1数组完全复制到原来str数组中,更新字母,将删除后的字母串更新到原数组中 
			str[i]=str1[i];         //依照题目输入样例,具体变化过程如下数字变化从deeedbbcccbdaa
                                               //到   ddbbbdaa
							                 //到   dddaa
							                //到 aa 
			
			                     
		}
		n=cnt;
		cnt=0;//初始化 
	}
	for(int i=1;i<=cnt;i++){
		cout<<str1[i];//输出最终结果 
	}
	return 0;
}
/*
2
deeedbbcccbdaa
*/

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的 C 语言链表祖玛游戏的代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> #define ROW 5 #define COL 6 #define COLOR_NUM 3 typedef struct ball { int color; struct ball *next; } Ball; void init_board(int board[ROW][COL]) { int i, j; srand(time(NULL)); for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { board[i][j] = rand() % COLOR_NUM; } } } void print_board(int board[ROW][COL]) { int i, j; for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { printf("%d ", board[i][j]); } printf("\n"); } } Ball *create_ball(int color) { Ball *ball = (Ball *)malloc(sizeof(Ball)); ball->color = color; ball->next = NULL; return ball; } void add_ball(Ball **head, int color) { Ball *ball = create_ball(color); if (*head == NULL) { *head = ball; } else { Ball *p = *head; while (p->next != NULL) { p = p->next; } p->next = ball; } } void init_balls(Ball **head, int board[ROW][COL], int row, int col) { int i, j; for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { if (i == row && j == col) { continue; } add_ball(head, board[i][j]); } } } void print_balls(Ball *head) { while (head != NULL) { printf("%d ", head->color); head = head->next; } printf("\n"); } Ball *remove_balls(int board[ROW][COL], int row, int col) { Ball *head = NULL; int color = board[row][col]; int i, j; // check left for (i = col - 1; i >= 0; i--) { if (board[row][i] != color) { break; } } if (col - i >= 3) { for (j = i + 1; j <= col; j++) { init_balls(&head, board, row, j); board[row][j] = -1; } } // check right for (i = col + 1; i < COL; i++) { if (board[row][i] != color) { break; } } if (i - col >= 3) { for (j = col; j < i; j++) { init_balls(&head, board, row, j); board[row][j] = -1; } } // check up for (i = row - 1; i >= 0; i--) { if (board[i][col] != color) { break; } } if (row - i >= 3) { for (j = i + 1; j <= row; j++) { init_balls(&head, board, j, col); board[j][col] = -1; } } // check down for (i = row + 1; i < ROW; i++) { if (board[i][col] != color) { break; } } if (i - row >= 3) { for (j = row; j < i; j++) { init_balls(&head, board, j, col); board[j][col] = -1; } } return head; } void drop_balls(int board[ROW][COL]) { int i, j, k; for (j = 0; j < COL; j++) { for (i = ROW - 1; i >= 0; i--) { if (board[i][j] == -1) { for (k = i - 1; k >= 0; k--) { if (board[k][j] != -1) { board[i][j] = board[k][j]; board[k][j] = -1; break; } } if (k == -1) { board[i][j] = rand() % COLOR_NUM; } } } } } int main() { int board[ROW][COL]; Ball *balls = NULL; int row, col; init_board(board); print_board(board); while (1) { printf("Input row and col: "); scanf("%d %d", &row, &col); if (row < 0 || row >= ROW || col < 0 || col >= COL) { printf("Invalid input!\n"); continue; } if (board[row][col] == -1) { printf("This ball has been removed!\n"); continue; } balls = remove_balls(board, row, col); if (balls == NULL) { printf("No balls can be removed!\n"); continue; } printf("Removed balls: "); print_balls(balls); free(balls); drop_balls(board); print_board(board); } return 0; } ``` 该代码使用了链表来存储被移除的小球,移除过程使用了递归函数,下落过程使用了嵌套循环。运行该代码可以与用户交互进行祖玛游戏

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值