#P2076. 第2题-小美捉迷藏
-
1000ms
Tried: 90
Accepted: 34
Difficulty: 2
所属公司 :
美团
时间 :2024年9月14日
第2题-小美捉迷藏
思路
此题直接模拟即可,找出三个人的位置,分别从三个人的的位置出发,向字符串左右扫描寻找其他两人的位置并记录,碰见障碍则终止,若没找到一个则返回-1,否则返回最小值
代码
c++
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
string s;
int ansR,ansB,ansG;
int sol(int pos)
{
int a=1e9,b=1e9;
for(int i=pos-1;i>=0;i--)
{
if(s[i]=='R'||s[i]=='G'||s[i]=='B')
{
if(a!=1e9)b=pos-i;
else a=pos-i;
}
if(s[i]=='#')break;
}
for(int i=pos+1;i<s.size();i++)
{
if(s[i]=='R'||s[i]=='G'||s[i]=='B')
{
if(a!=1e9)b=i-pos;
else a=i-pos;
}
if(s[i]=='#')break;
}
if(a==1e9&&b==1e9)return -1;
else return min(a,b);
}
int main()
{
cin>>s;
for(int i=0;i<s.size();i++)
{
if(s[i]=='R')ansR=sol(i);
if(s[i]=='G')ansG=sol(i);
if(s[i]=='B')ansB=sol(i);
}
cout<<ansR<<' '<<ansB<<' '<<ansG<<endl;
return 0;
}
java
import java.util.Scanner;
public class Main {
static String s;
static int ansR = -1, ansB = -1, ansG = -1;
static int sol(int pos) {
int a = Integer.MAX_VALUE, b = Integer.MAX_VALUE;
// 向左查找
for (int i = pos - 1; i >= 0; i--) {
if (s.charAt(i) == 'R' || s.charAt(i) == 'G' || s.charAt(i) == 'B') {
if (a != Integer.MAX_VALUE) {
b = pos - i;
} else {
a = pos - i;
}
}
if (s.charAt(i) == '#') break;
}
// 向右查找
for (int i = pos + 1; i < s.length(); i++) {
if (s.charAt(i) == 'R' || s.charAt(i) == 'G' || s.charAt(i) == 'B') {
if (a != Integer.MAX_VALUE) {
b = i - pos;
} else {
a = i - pos;
}
}
if (s.charAt(i) == '#') break;
}
if (a == Integer.MAX_VALUE && b == Integer.MAX_VALUE) {
return -1;
} else {
return Math.min(a, b);
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
s = scanner.nextLine();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == 'R') ansR = sol(i);
if (s.charAt(i) == 'G') ansG = sol(i);
if (s.charAt(i) == 'B') ansB = sol(i);
}
System.out.println(ansR + " " + ansB + " " + ansG);
}
}
python
def sol(s, pos):
a = float('inf')
b = float('inf')
# 向左查找
for i in range(pos - 1, -1, -1):
if s[i] in 'RGB':
if a != float('inf'):
b = pos - i
else:
a = pos - i
if s[i] == '#':
break
# 向右查找
for i in range(pos + 1, len(s)):
if s[i] in 'RGB':
if a != float('inf'):
b = i - pos
else:
a = i - pos
if s[i] == '#':
break
if a == float('inf') and b == float('inf'):
return -1
else:
return min(a, b)
# 主程序
s = input()
ansR = ansB = ansG = -1
for i in range(len(s)):
if s[i] == 'R':
ansR = sol(s, i)
elif s[i] == 'G':
ansG = sol(s, i)
elif s[i] == 'B':
ansB = sol(s, i)
print(ansR, ansB, ansG)
题目内容
小美 (R)、小蓝(B)和小绿(G)正在一个字符串上玩捉迷藏。他们所在的位置用对应字母表示,其他位置为空地('*’)或障碍('#') 。 寻找方可以每秒移动一个位置,躲藏方不能移动。当寻找方移动到躲藏方的位置时,躲藏方被认为被找到。但是在过程中,双方均不可以移动到障碍上。 当一个人作为寻找方,另外两个人作为躲藏方时,只要寻找方找到一个躲藏方即认为游戏胜利。 请计算三个人分别作为寻找方时,能够使游戏胜利所需的最少时间。
输入描述
在一行上输入一个仅由"*#RGB"组成的字符串s(3≤∣s∣≤105),保证"RGB"各只出现一次。
输出描述
在一行上输出三个整数,代表小红、小蓝和小绿作为寻找方时,能够获胜的最少时间;如果无法获胜,则直接输出−1。
样例1
输入
R***B**G
输出
4 3 3
样例2
输入
R****B***#G
输出
5 5 -1