桐桐的游戏
题目大意:
有一个用数组成的环要从1跳到z(有些点不能跳),每次跳的步数最少有多少步
原题:
题目描述
桐桐最近在玩一个跳棋游戏,规则是:有个圆圈,分成N等分,顺时针标号为1到N。假设其中有些段的障碍。桐桐从1号段出发,每次顺时针跳K段,目标是跳到第Z号段,但过程中不能跳到障碍段上去。
假如,N=13,K=3,Z=9,则跳的路径上的段号为1,4,7,10,13,3,6和9,在此假设没有跳到障碍段上去。
现在请帮桐桐求出最小的K。
输入
第一行有整数N,Z和M(2≤N≤1000,2≤Z,0≤M≤N-2)。
N表示圆分成的段数,Z表示桐桐想跳到的目标段号,M表示障碍数。
第二行有M个数,表示有障碍的段号。段1和段Z保证没有障碍。
输出
一个数K。
输入样例
【输入样例1】
7 4 16
【输入样例2】
9 7 22 3
【输入样例3】
7 6 22 4
输出样例
【输出样例1】
1
【输出样例2】
3
【输出样例3】
5
解题思路:
直接枚举跳的步数,然后模拟看行不行
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int n,m,z,x,k,p[1050],pp[1050];
int main()
{scanf("%d %d %d",&n,&z,&m);for (int i=1;i<=m;++i){scanf("%d",&x);p[x]=1;}for (int i=0;i<z;++i)//枚举{memset(pp,0,sizeof(pp));pp[1]=1;k=1;while(k!=z){k=(k+i-1)%n+1;//往后跳if (pp[k]||p[k]) break;//不能再跳了}if (k==z){printf("%d",i);break;}}
}