割草机---牛客

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

有一块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

4 5
GWGGW
GGWGG
GWGGG
WGGGG

输出

复制11

11

示例2

输入

复制3 3 GWW WWW WWG

3 3
GWW
WWW
WWG

输出

复制7

7

思路:单纯的深搜在此题中只能通过部分数据,会超时。那么我们可以进行优化,首先,可以去除最后都是空地的行,对于有草的行我们则需记录其最左最右的草堆位置方便进行计算。

import java.util.Scanner;

public class Main{
	static int n,m,ans=Integer.MAX_VALUE,N=155,t=0;
	static boolean st[][]=new boolean[N][N];
	static char g[][]=new char[N][N];
	static int l[]=new int[N],r[]=new int[N];
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner cin=new Scanner(System.in);
		n=cin.nextInt();
		m=cin.nextInt();
		
		int nn=0;//得到最后一行有草的位置
		int ans=0;
		for(int i=0;i<n;i++) {
			String s=cin.next();
			g[i]=s.toCharArray();
			
			l[i]=-1;r[i]=-1;
			//得到最左边的草的位置
			for(int j=0;j<m;j++) {
				if(g[i][j]=='W') {
					l[i]=j;
					nn=i;
					break;
				}
			}
			//得到最右边的草的位置
			for(int j=m-1;j>=0;j--) {
				if(g[i][j]=='W') {
					r[i]=j;
					break;
				}
			}
		}
		
		ans=nn;//我们需要向下走的步数,即单位时长
		int p=0;//记录上一行从哪个位置下来
		for(int i=0;i<=nn;i++) {
			if(l[i]==-1)continue;
			int flag=(i%2==0)?1:-1;

			ans+=r[i]-l[i];
			
			if(flag==1) {
				ans+=Math.abs(l[i]-p);
				p=r[i];
			}else {
				ans+=Math.abs(r[i]-p);
				p=l[i];
			}
		}
		
		System.out.println(ans);
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值