CF

my english is poor

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

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

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

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

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

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

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

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

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

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