草是'W'。难点是很容易漏情况。
input
4 5 GWGGW GGWGG GWGGG WGGGG
output
11
#include<bits/stdc++.h> using namespace std; string x[155]; int y[155]; int z[155]; int main(){ int n,m; cin>>n>>m; int s=0,w=0; for(int i=0;i<n;++i){ cin>>x[i]; int g=-1; for(int j=0;j<m;++j){ if(x[i][j]=='W') g=j; } y[i]=g; g=1000000000; for(int j=m-1;j>=0;--j){ if(x[i][j]=='W') g=j; } z[i]=g; if(g!=1000000000) w=i+1; //有效行数 } if(w==0){ //特判,最后不用-1 cout<<0<<endl; return 0; } int h=0,i; for(i=0;i<w-1;++i){ //最后一行不用管下一行,特判 if(i%2==0){ if(max(y[i+1],y[i])==-1) continue; //这行和下行都是G,不动 s+=abs(max(y[i+1],y[i])-h); //注意加abs ! 这行要走的最右边比上行最后(暂时)位置靠左/靠右 cout<<0<<" "<<max(y[i+1],y[i])<<" "<<h<<endl; h=max(y[i+1],y[i]); } else{ if(min(z[i+1],z[i])==1000000000) continue; s+=abs(h-min(z[i+1],z[i])); cout<<1<<" "<<h<<" "<<min(z[i+1],z[i])<<endl; h=min(z[i+1],z[i]); } } if(i%2==0){ s+=y[i]-h; } else{ s+=h-z[i]; } cout<<w-1+s<<endl; } /* 7 5 WGGGG GGGGG WWWGW GGGGG GGGGG GGGWG WGGWW 0 0 0 1 0 0 0 4 0 0 3 4 1 3 0 16(18) 7 5 GGGGG GGGGG GWWGG GWWGW WGGGG WGGWG WWGWG 1 0 1 0 4 1 1 4 0 0 3 0 1 3 0 21(23) */