题目描述
There are N squares arranged in a row, numbered 1,2,...,N from left to right. You are given a string S of length N consisting of . and #. If the i-th character of S is #, Square i contains a rock; if the i-th character of S is ., Square i is empty.
In the beginning, Snuke stands on Square A, and Fnuke stands on Square B.
You can repeat the following operation any number of times:
Choose Snuke or Fnuke, and make him jump one or two squares to the right. The destination must be one of the squares, and it must not contain a rock or the other person.
You want to repeat this operation so that Snuke will stand on Square C and Fnuke will stand on Square D.
Determine whether this is possible.
Constraints
4≤N≤200000
S is a string of length N consisting of . and #.
1≤A,B,C,D≤N
Square A, B, C and D do not contain a rock.
A, B, C and D are all different.
A<B
A<C
B<D
输入
Input is given from Standard Input in the following format:
N A B C D
S
输出
Print Yes if the objective is achievable, and No if it is not.
样例输入
7 1 3 6 7
.#..#..
样例输出
Yes
题意
有长度为n的,仅由‘.’和‘#’组成的字符串,给出a,b,c,d的位置,a要走到c,b要走到d。在走的过程当中,a和b只能向右走1或2步,并且为‘#’和已经有车的地方不能走。问,a和b能不能到达要求的位置。
分析
三种情况:
1、c==d,显然不行。
2、c<d。既然a一定小于b,那么先让b走到d,再让a走到c,看看能不能完成。
3、c>d。先按第二种方法走,看看能不能到达。如果不能,那么就需要a超车b,超车条件为有三个连续的空地。
代码
#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
const int N=200010;
char s[N];
int main()
{
int n,a,b,c,d;
scanf("%d%d%d%d%d",&n,&a,&b,&c,&d);
scanf("%s",s+1);
int len=strlen(s);
if(c==d)
printf("No\n");
else if(c<d)
{
int flag=1;
for(int i=b;i<d;i++)
{
if(s[i]=='#'&&s[i+1]=='#')
{
flag=0;
break;
}
}
for(int i=a;i<c;i++)
{
if(s[i]=='#'&&s[i+1]=='#')
{
flag=0;
break;
}
}
printf(flag?"Yes\n":"No\n");
}
else
{
int flag=1;
for(int i=b;i<d;i++)
{
if(s[i]=='#'&&s[i+1]=='#')
{
flag=0;
break;
}
}
for(int i=a;i<c;i++)
{
if(s[i]=='#'&&(s[i+1]=='#'||i+1==d) || i==d&&s[i+1]=='#')
{
flag=0;
break;
}
}
if(flag)
printf("Yes\n");
else
{
int f=0;
for(int i=b-1;i<=d-2;i++)
{
if(s[i]=='.'&&s[i+1]=='.'&&s[i+2]=='.')
{
f=1;
break;
}
}
if(!f)
printf("No\n");
else
{
for(int i=a;i<c;i++)
{
if(s[i]=='#'&&s[i+1]=='#')
{
f=0;
break;
}
}
for(int i=b;i<d;i++)
{
if(s[i]=='#'&&s[i+1]=='#')
{
f=0;
break;
}
}
printf(f?"Yes\n":"No\n");
}
}
}
return 0;
}