多米诺骨牌游戏

问题描述

多米诺骨牌游戏规则非常简单,将骨牌按一定间距的尺寸排成单行,或分行排成一片。推倒第一张骨牌,其余发生连锁反应依次倒下,或形成一条长龙,或形成一幅图案。

小 A 觉得多米诺骨牌超级没意思,所以他想了点小花招。

小 A 将 n 个多米诺骨牌放在一条线上,每一块都垂直竖立。他同时将一些骨牌向左或向右推倒。 每过一秒,被推向左边或右边的骨牌会将左边或右边的相邻骨牌推倒。当一个骨牌,其左边倒向它的骨牌数目与其右边倒向它的骨牌数目相等时,由于力的平衡,该骨牌将依然保持竖立。

给定小 A 最初推骨牌的方向,求出最后依然保持竖立的骨牌数目和位置。

输入格式

输入数据第一行包括一个整数 n(1≤n≤3000),表示这一行多米诺骨牌的数目。下一行包括一个长度为 n 的字符串,字符串的第 i 个字符意义如下:

“L”,第 i 个字符将要被向左推。

“R”,第 i 个字符将要被向右推。

“.”,第 i 个字符不会被推。

输出格式

首先输出保持竖立的骨牌数目。如果保持竖立的骨牌数目不为 0,下一行输出保持竖立的骨牌的位置,骨牌位置从 1 到 n。

每两个数之间用一个空格隔开,注意最后一个数后面没有空格。

输入样例

14

.L.R…LR…L…

5

R…

1

.

输出样例

4

3 6 13 14

0

1

1

def solution(num, data):
    # Please write your code here
    pre  = ""
    while pre != data:
        pre = data 
        data = data.replace("R.L","X")
        data = data.replace("R.","RR")
        data = data.replace(".L","LL")
        data = data.replace("X","R.L")

    num = 0
    upright_positions = []
    for i in range(len(data)):
        if data[i]== ".":
            num += 1
            upright_positions.append(i+1)
    if num == 0:
        return str(num)
    return f"{num}:{','.join(map(str, upright_positions))}"


if __name__ == "__main__":
    # 直接打印函数的返回值
    print(solution(14, ".L.R...LR..L..") == "4:3,6,13,14")
    print(solution(5, "R....") == "0")
    print(solution(1, ".") == "1:1")

### C++ 实现多米诺骨牌游戏 对于多米诺骨牌游戏的实现,可以考虑模拟每个多米诺骨牌的状态变化。下面是一个基于给定条件的解决方案[^4]。 #### 初始化环境 首先定义必要的变量来存储输入以及处理后的结果: ```cpp #include <iostream> #include <string> using namespace std; ``` #### 主函数逻辑 接收一个多米诺排列作为输入并返回最终稳定状态下的配置: ```cpp string pushDominoes(string dominoes) { string result = ""; while(true){ result = dominoes; for(int i = 0 ; i<dominoes.size(); ++i){ if(dominoes[i]!='.') continue; bool leftPushed=false,rightPushed=false; if(i>0 && dominoes[i-1]=='R') rightPushed=true; if(i+1<dominoes.size()&&dominoes[i+1]=='L') leftPushed=true; if(leftPushed && !rightPushed) result[i]='L'; else if(!leftPushed && rightPushed) result[i]='R'; } if(result == dominoes) break; else dominoes=result; } return result; } ``` 这段代码通过循环迭代更新每一秒内所有可能改变方向的多米诺的位置直到不再发生变化为止。每次遍历时检查当前字符是否为'.'(即未被推动),如果是,则查看左右邻居是否有力量作用于它,并据此调整其新位置。当一轮下来没有任何变动发生时结束循环输出最后的结果。 #### 完整程序框架 为了使上述功能能够独立运行,在`main()`函数中加入读取用户输入的部分: ```cpp int main(){ string input; getline(cin,input); cout<<pushDominoes(input)<<endl; return 0; } ``` 这样就可以从标准输入获取一行代表初始设置的数据串,调用之前编写的辅助方法计算出最终形态再打印出来完成整个流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值