按照题干中的四种方式走,只要向下走一行,方向就会转变,问最少走的步数能够除掉所有的草。
思路:
1、对应初始的时候是向右走的,首先需要向右走走到最右边的那个W的位子。
2、然后继续判断下一行,如果下一行有W在当前位子右边,还要推着小车向右多走几步。
3、对应同理,如果在向左走的时候,在当前行首先我们走到最左边的那个W的位子,然后再判断下一行,如果下一行有W在当前位子的左边,那么我们还要推着小车向左多走几步。
4、注意当割完所有草之后要跳出,要不然会有多余的行走步数。
Ac代码:
#include<stdio.h>
#include<string.h>
using namespace std;
char a[165][165];
int n,m;
int abs(int aaa)
{
if(aaa<0)return -aaa;
else return aaa;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
int sum=0;
for(int i=0; i<n; i++)
{
scanf("%s",a[i]);
for(int j=0; j<m; j++)
{
if(a[i][j]=='W')sum++;
}
}
int d=1;
int tmp=0;
int output=0;
int y=0;
for(int i=0; i<n; i++)
{
int maxn=-1;
//printf("%d %d %d\n",y,tmp,output);
if(tmp==sum)break;
for(int j=0; j<m; j++)
{
if(a[i][j]=='W')
{
if(d==1)maxn=j;
else
{
if(maxn==-1)maxn=j;
}
}
if(a[i+1][j]=='W')
{
if(d==1)maxn=j;
else
{
if(maxn==-1)maxn=j;
}
}
}
if(maxn==-1)
{
output+=1;
d=1-d;
continue;
}
else
{
if(d==1)
{
d=0;
output+=abs(y-maxn);
for(int z=0; z<m; z++)
{
if(a[i][z]=='W')tmp++;
}
y=maxn;
if(i!=n-1&&tmp!=sum)output++;
}
else
{
d=1;
output+=abs(y-maxn);
for(int z=0; z<m; z++)
{
if(a[i][z]=='W')tmp++;
}
y=maxn;
if(i!=n-1&&tmp!=sum)output++;
}
}
}
printf("%d\n",output);
}
}