思路:不管怎么走,都必须从第一个有'W'的行走到最后一个有'W'的行,对于每一行,都必须处理完这行所有的'W',如果在奇数行,那就应该走到这行和下一行有W的最右边,再往下走,如果在偶数行,那就应该走到该行和下一行有W的最左端,然后往下走,这样才能保证把所有草割完。
注意:预先处理最后有W的一行,割到这行之后,就不用再往下割草了
#include<bits/stdc++.h>
using namespace std;
char str[200][200];
struct node{
int l,r;
}r[401];
int main()
{
int n,m,sum=0,last=0;
scanf("%d%d",&n,&m);
for(int i=0;i<=n;i++){
r[i].l=200;
r[i].r=-1;
}
for(int i=0;i<n;i++) scanf("%s",str[i]);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(str[i][j]=='W'&&j>r[i].r) r[i].r=j;
if(str[i][j]=='W'&&j<r[i].l) r[i].l=j;
if(str[i][j]=='W') last=i;
}
}
int t=0;
for(int i=0;i<=last;i++){
if(i%2==0){
int tt=max(r[i].r,r[i+1].r);
if(tt-t>0){
sum+=(tt-t);
t=tt;
}
}
else{
int tt=min(r[i].l,r[i+1].l);
if(t-tt>0){
sum+=(t-tt);
t=tt;
}
}
}
cout<<sum+last<<endl;
return 0;
}