石油大第十场--问题 A: Kenken Race

题目描述

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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值