题目描述
有一块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
输出
11
示例2
输入
3 3
GWW
WWW
WWG
输出
7
思路
因为只能面朝右和面朝左,所以这是一个模拟题,奇数的时候向右走,偶数的时候向左走
用一个数组存储每一行的左右草的端点位置和他们之间的距离
对第一行进行特判,然后模拟割草就行了。。不过bug特别多,调了好久
代码
#include <bits/stdc++.h>
using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long ll;
const int N=150+20;
int n,m;
char e[N][N];
int num[N][3];
int f(int x)
{
return x<0?-x:x;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)
{
scanf("%s",e[i]+1);
for(int j=1; j<=m; j++)
if(e[i][j]=='W')
{
num[i][1]=j;
break;
}
for(int j=m; j>=1; j--)
if(e[i][j]=='W')
{
num[i][2]=j;
break;
}
if(num[i][1]==0)
num[i][0]=-1;
else
num[i][0]=num[i][2]-num[i][1];
}
int op=1,sum=0;
if(num[1][0]!=-1)
{
sum+=f(num[1][2]-op);
op=num[1][2];
}
int add=0;
for(int i=2; i<=n; i++)
{
if(num[i][0]==-1)
{
add++;
continue;
}
else
{
sum+=add;
add=0;
}
if(i&1)
{
sum+=f(num[i][1]-op)+num[i][0]+1;
op=num[i][2];
}
else
{
sum+=f(num[i][2]-op)+num[i][0]+1;
op=num[i][1];
}
}
printf("%d\n",sum);
return 0;
}