CF - 405B - Domino Effect

时间:2023-03-08 22:29:57

my english is poor

给你一列全部站立的骨牌,同时向左或向右推其中的几个

保证推得方式为: 。。。左,右,左,右,左。。。

即不存在两个相邻的又往相同方向推倒的

刚开始是从左往右一个一个遍历,若第一次推的为往左,将它前面的加起来

再根据 L ,R 判断,累加站立的,还有。。。。太麻烦了

写好程序测试数据正确,提交后WA。。。

有想到用数组记下站立的个数,但不知如何实现。。。

百度一下。。。刚开始看不懂代码。。先提交。。AC。。了

代码如下,注释是我自己的理解

#include<stdio.h>
#include<string.h>
char ch[];
int k[]; //标记数组:1 表示倒下,0 表示站立
int main()
{
int n,i;
scanf("%d",&n);
memset(k,,sizeof(k)); //初始化全部站立
scanf("%s",ch+); //数组 ch 从下标 1 开始
for(i=; i<=n; i++)
{
if(ch[i]=='L') //第 i 个字符为 L ,是往左推的
{
for(int j=i; j>; j--) //往左找
{
k[j]=; //先全部推倒
if(ch[j]=='R') //突然发现前面有个往右推的,不中,不能全推倒
{
if((i-j)%==) //若它们中间的骨牌个数为奇数
k[(i-j)/]=; // 将中间那个骨牌扶起
break; //跳出循环,不往前倒了
}
}
}
if(ch[i]=='R') //第 i 个字符为 R 往右推倒
{
for(int j=i; j<=n; j++) //往右找
{
k[j]=; //也先全推倒
if(ch[j]=='L') //突然发现后面有个往左推的
{
if((j-i)%==) //若它们中间的骨牌个数为奇数
k[(j+i)/]=; //将中间那个骨牌扶起
i=j; //再从后面发现的那个往左推的开始找
break; //跳出循环,不能往后推了
}
}
}
}
int cnt=;
for(i=; i<=n; i++) //推完了,累死我了,放松一下,统计统计几个没有战死沙场的
if(!k[i])
cnt++;
printf("%d\n" ,cnt);
return ;
}