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; }