题目链接:https://www.nowcoder.com/acm/contest/35/C
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
有一块n*m的地,每块地要么长满杂草(用'
W'表示),要么是空地(用'
G'表示),现在有一个人站在(1,1),面向(1,m),他可以按如下两种方式移动:
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
解析:刚看题时,还以为是搜索,再一看,其实走的方法是唯一的,在上一行向左走,那么下一行只能向右走,一个模拟题
代码:
#include<bits/stdc++.h>
using namespace std;
int mp[201][201];
int vis[201];
int main()
{
int n, m;
char ch;
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
scanf(" %c", &ch);
if(ch == 'W') mp[i][j] = 1;
else mp[i][j] = 0;
if(mp[i][j]) vis[i] = 1;
}
}
for(int i = n - 1; i >= 1; i--) vis[i] += vis[i+1];
int p = 1;
int ans = 0;
for(int i = 1; i <= n; i++)
{
if(!vis[i]) break;
int j, l, r;
for(j = 1; j <= m; j++)
{
if(mp[i][j]) break;
}
if(j > m) l = p;
else l = j;
for(j = m; j >= 1; j--)
{
if(mp[i][j]) break;
}
if(j < 1) r = p;
else r = j;
if(i == 1)
{
ans = r - 1;
p = r;
continue;
}
if(i&1)
{
if(p < l)
{
ans += l - p + 1;
ans += r - l;
p = r;
}
else
{
ans += p - l + 1;
ans += r - l;
p = r;
}
}
else
{
if(p < r)
{
ans += r - p + 1;
ans += r - l;
p = l;
}
else
{
ans += p - l + 1;
p = l;
}
}
}
printf("%d\n", ans);
return 0;
}