思路:由于水平方向只有两种走法,所以一定是从开始向右,然后向左,,向右。。。。。。所以奇数行向右,偶数行向左,注意一下上一行的最后位置就好。最后加上每次往下走的代价。
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 155;
char str[MAXN][MAXN];
pair<int, int> num[MAXN];
int n, m;
int main()
{
while(~scanf("%d %d", &n, &m))
{
memset(num, -1, sizeof(num));
for(int i=0; i<n; ++i)
scanf("%s", str[i]);
int ans=0;
int flag;
for(int i=0; i<n; ++i)
{
flag=0;
for(int j=0; j<m; ++j)
{
if(str[i][j]=='W')
{
if(!flag)
num[i].first=num[i].second=j, flag=1;
else
num[i].second=j;
}
}
}
// for(int i=0; i<n; ++i)
// printf("num[%d]=%d %d\n", i, num[i].first,num[i].second);
int v=0;
for(int i=0; i<n; ++i)
{
if(num[i].first==-1)
continue;
if((i^1)&1)
{
if(v>num[i].first)
ans+=v-num[i].first, v=num[i].first;
ans+=num[i].second-v;
v=num[i].second;
}
else
{
if(v<num[i].second)
ans+=num[i].second-v,v=num[i].second;
ans+=v-num[i].first;
v=num[i].first;
}
}
//printf("%d\n", ans);
for(int i=n-1; i>=0; --i)
if(num[i].first!=-1)
{
printf("%d\n", ans+i);
break;
}
}
return 0;
}