链接:登录—专业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);
}
}