题目描述
有一块n*m的地,每块地要么长满杂草(用’W’表示),要么是空地(用’G’表示),现在有一个人站在(1,1),面向(1,m),他可以按如下两种方式移动:
1、向面朝的方向移动一格,耗费1单位时间
2、向下移动一格,并反转面朝的方向(右变左,左变右),耗费1单位时间
现在他想知道清除所有的杂草最少需要多少单位时间(清除完杂草之后不用返回(1,1))
输入描述:
第一行n,m
接下来n行每行一个字符串表示矩阵。
n,m<=150
输出描述:
一行一个整数表示答案。
示例1输入
4 5 GWGGW GGWGG GWGGG WGGGG
样例1输出
11
示例2输入
3 3 GWW WWW WWG
样例2输出
7
分析: 小明割草只有两个方向 向右和向左,并且奇数行时他是从左向右进行割草的,偶数行它是从右往左割草的.
当从奇数行向下进入偶数行时,要从这两行中草的最大纵坐标处下去;当从偶数行割到奇数行时,要从这两行中最小的纵坐标处下去;
然后进行模拟即可
参考代码:
// #include<bits/stdc++.h> using namespace std; int g[200][3];//arr[]:记录每一行的草地 g:记录每行草地最左边和最右边的位置 char arr[200]; string str; int n,m,last,end1,res,start;//last:最后一行的位置 int main() { cin>>n>>m; for(int i = 1; i <=n+1; i++) { g[i][1] = 200;//g[i][] 初始化 g[i][2] = -100; } for(int i = 1; i <= n; i++) { memset(arr,'0',sizeof(arr)); scanf("%s",arr+1); //cin>>str; for(int j = 1; j<=m; j++) { if(arr[j]=='W') { if(j<g[i][1]) { //寻找该行草在最左边出现的位置 g[i][1] = j; } if(j>g[i][2]) { //寻找该行草在最右边出现的位置 g[i][2] = j; } last = i;//存放最后一行. } } } // 开始割草 start = 1;//从哪个位置开始割草 初始为1 for(int i = 1; i <= last; i++) { if(i%2) { //>0 奇数行 end1 = max(g[i][2],g[i+1][2]); if(end1-start>0 ) { res += (end1-start); start = end1; } } else { //偶数行 end1 = min(g[i][1],g[i+1][1]); if((start - end1) > 0 ) { res += (start - end1); start = end1; } } } cout<<res+last-1<<endl; return 0; } //4 4 //GGWW //GGGG //GGGG //WWWW //3 4 //GGWW //GGGG //WWWW //11