跳坑小能手
Time Limit: 2000/1000ms (Java/Others)
Problem Description:
GDUFE-GAME现场有一个游戏场地人头窜动,围观参与游戏的学生在场上跳来跳去。每次游戏一名参与者,且每次游戏结束时场地都会出现随机的变化(游戏过程中场地不会发生变化,只在更换参与者时变化)。场地有两种类型:第一种是高台,第二种是深坑。参与者从任意高台出发向前跳,规定每次向前跳的步伐大小相同,但步伐大小由参与者自行决定,必须大于0。只要跳7次不掉入坑中,便能获得奖品。QWER决定参加,但是为了奖品,他提出,参与者能决定什么时候上场。提议被组织者接受之后,QWER现在需要你帮他决定对于每一个场地,他能不能上场赢得游戏。
Input:
数据包含多个测试实例。
每个测试实例第一行是一个整数 n (1 ≤ n ≤ 100);第二行 n 个字符表示场地,其中:'*'表示高台的一部分,'.'代表深坑的一部分。
Output:
对于每个测试实例,如果QWER上场能赢,输出"Yes"(不包括引号),否则输出"No"(不包括引号)。
Sample Input:
15
*.***.*.*.*.*.*
15
***.*..********
Sample Output:
Yes
Yes
解题思路:暴力大法即可解决。由于题目给的字符串最长为100,所以对当前每个字符作为起点i,往后枚举加上步长j后的坐标,同时至少需要7跳才能获奖,所以用tmp(=i+j*k,可以用来判断是否跳出了n(即大于等于n))保存每跳到的点,并判断是否为坑。在起点、步长变化(控制变量)下,进行7次跳,如果跳的过程遇到坑即'.'就退出当前跳的步长,换下一个步长,依次暴力枚举下去,如果flag为true,则可以获奖。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
char a[];
int n,tmp;
bool flag;
while(cin>>n){
cin>>a;
flag=false;
for(int i=;i<n-;++i){ //给出的至少有7个字符
if(a[i]=='.')continue; //如果当前字符是坑'.'跳过下面
for(int j=;j<n;++j){ //枚举步长,从1开始枚举
for(int k=;k<=;++k){ //至少跳7次
tmp=i+j*k; //来保存暂时的下标,可以防止越界
if(tmp>=n || a[tmp]=='.')break; //如果跳的过程遇到坑或者超过n,退出
if(k==)flag=true; //能跳到7次说明可以获奖
}
if(flag)break;
}
if(flag)break;
}
cout<<(flag?"Yes":"No")<<endl;
}
return ;
}