109468.祖玛游戏

题目描述

当JZP再次醒来时,发现他在yxy的地盘上。
他发现他进入了一个祖玛游戏:地上有一圈槽形成一个圆,他在圆心上。在一圈槽上有n个可以摆放球的地方,在他的旁边有m个洞,可以从每个洞都可以拿到无限多的一种球(有红的,黄的,绿的...)。 JZP将这m种球放在这n个槽里,问他能摆多少种情况(如果将圆翻折和旋转一样则视为一种,不可以不放球)。

#include<stdio.h> #include<malloc.h> #include<string.h> #define ERROR NULL #define true 1 #define false 0 typedef char ElementType; typedef int bool; typedef struct LNode * PtrToLNode; struct LNode{ ElementType Data; PtrToLNode Next; }; typedef PtrToLNode Position; typedef PtrToLNode List; int Length(List L){ //获取链表的长度 Position p; int cnt = 0; //长度计数 p = L; while(p){ p = p->Next; cnt++; } return cnt; } bool Insert(List L, ElementType X, int i){ //插入链表 Position tmp, pre; int cnt = 0; pre = L; while (pre && cnt<i-1) { pre = pre->Next; cnt++; } if(pre == NULL || cnt != i-1){ //设置第一个链表节点是额外的,题目数据从第二个开始,防止出现这种情况 tmp = (Position)malloc(sizeof(struct LNode)); tmp -> Data = X; tmp -> Next = pre -> Next; pre -> Next = tmp; return true; } else{ tmp = (Position)malloc(sizeof(struct LNode)); tmp -> Data = X; tmp -> Next = pre -> Next; pre -> Next = tmp; return true; } } bool Delete(List L, int i){//删除节点 Position tmp, pre; int cnt = 0; pre =L; while(pre&&cnt<i-1){ pre = pre->Next; cnt++; } if(pre == NULL || cnt != i-1 || pre->Next == NULL){ //设置第一个链表节点是额外的,题目数据从第二个开始,防止出现这种情况 return false; } else{ tmp = pre->Next; pre->Next = tmp->Next; free(tmp); //释放内存 return true; } } bool hasRepeat(List L){ //判断是否有重复 int len = Length(L); int i=0; Position Pos = L; while(i<len){ char t = Pos->Data; int stratpos = i; int times = 0;//统计重复的次数 Position dPos = Pos; while(i<len&&t == Pos->Data){ times++; //统计重复的次数 Pos = Pos->Next; i++; } if(times>=3){ for(int j=0;j<3;j++){ //当出现三个以上重复,删除对应的三个节点 Delete(L, --i); } return true; } } return false; } int main(){ List L; char new[1000]; scanf("%s",new); L = (List)malloc(sizeof(struct LNode)); L->Data = '@';//单独设置的链表头,设置第一个链表节点是额外的,题目数据从第二个开始,防止删除和插入异常 L->Next = NULL;//单独设置的链表头,设置第一个链表节点是额外的,题目数据从第二个开始,防止删除和插入异常 for(int i = 0;i<strlen(new);i++){ char new1 = new[i];//插入题目要求的数据 Insert(L, new1, i+1); } int n; int pos; char content; scanf("%d", &n); for(int i=0;i<n;i++){ scanf("%d %c", &pos, &content); //输入单个字符和字符的位置 Insert(L, content, pos+1); while(hasRepeat(L)); if(Length(L)==1)//仅包含单独设置的链表头 printf("-\n"); else{ Position p =L->Next; while(p!=NULL){ //遍历输出 printf("%c", p->Data); p = p->Next; } printf("\n"); } } }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值