CF116D 一开始往右扫,每换下一行要换方向扫,问扫完草至少经过的步数

草是'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)
*/


猜你喜欢

转载自blog.csdn.net/cacyth/article/details/51212712
116
今日推荐