题意:
给你张n*m的图,图上W表示草,G表示平地,一开始你从左上角朝右开始推草,每往下走一步朝向相反,问你最少需要走几步才能推完所有的草。
思路:
因为奇数行和偶数行的朝向是固定的,所以即使该行已经没有草了,但是由于下一行需要你还是得往前走,所以每行需要走的那一列就得由当前行和下一行的草来决定。还有如果当前行推完后已经没有草了,就没必要去下一行了,所有开个sum来记录还剩多少草。
#include<cstdio>
const int MAX=155;
int n,m;
char mp[MAX][MAX];
int main(){
scanf("%d%d",&n,&m);
int sum=0;
for(int i=1;i<=n;i++){
scanf("%s",mp[i]+1);
for(int j=1;j<=m;j++){
if(mp[i][j]=='W') sum++;
}
}
int ans=0,c=1;
for(int i=1;i<=n;i++){
if(i%2){
int t=c,num=0;
for(int j=c;j<=m;j++){
if(mp[i][j]=='W') t=j,num++;
if(i<n&&mp[i+1][j]=='W') t=j;
}
sum-=num;
ans+=t-c+(sum==0?0:1);
c=t;
}
else{
int t=c,num=0;
for(int j=c;j>=1;j--){
if(mp[i][j]=='W') t=j,num++;
if(i<n&&mp[i+1][j]=='W') t=j;
}
sum-=num;
ans+=c-t+(sum==0?0:1);
c=t;
}
if(!sum) break;
}
printf("%d\n",ans);
return 0;
}