桐桐的游戏【模拟】

>Description
有个圆圈,分成N等分,顺时针标号为1到N。假设其中有些段的障碍。桐桐从1号段出发,每次顺时针跳K段,目标是跳到第Z号段,但过程中不能跳到障碍段上去。
假如,N=13,K=3,Z=9,则跳的路径上的段号为1,4,7,10,13,3,6和9,在此假设没有跳到障碍段上去。
现在请帮桐桐求出最小的K。


>Input
第一行有整数N,Z和M(2≤N≤1000,2≤Z,0≤M≤N-2)。
N表示圆分成的段数,Z表示桐桐想跳到的目标段号,M表示障碍数。
第二行有M个数,表示有障碍的段号。段1和段Z保证没有障碍。

>Output
一个数K。


>Sample Input
【输入样例1】
7 4 1
6
【输入样例2】
9 7 2
2 3
【输入样例3】
7 6 2
2 4

>Sample Output
【输出样例1】
1
【输出样例2】
3
【输出样例3】
5


>解题思路
直接模拟T_T。
从小到大看看哪个数可以到达z且不会调到障碍段上。


>代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,z,m,a,ans;
bool lhq[1000005],c[1000005];
bool lil(int s)
{
	int aa=1;
	c[1]=1;
	while(1)
	{
		aa+=s;
		if(aa>n) aa%=n; //!!!环
		if(lhq[aa]) return 0; //如果踩到障碍
		if(c[aa]) return 0; //如果到达过
		if(aa==z) return 1; //如果到达了z
	}
}
int main()
{
	scanf("%d%d%d",&n,&z,&m);
	for(int i=1;i<=m;i++)
	 scanf("%d",&a),lhq[a]=1; //标记障碍
	for(ans=1;ans;ans++)
	{
		memset(c,0,sizeof(c)); //c记录此点是否到达过(如果第二次到达了这个点且没有到达z,说明永远都不会到达)
		if(lil(ans))
	    {
	 	    printf("%d",ans);
	 	    return 0;
	    }
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43010386/article/details/92091542
今日推荐