#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 1e3 + 5;
int gear[maxn];
int n;
bool flag;
int main()
{
while(~scanf("%d", & n))
{
for(int i = 0; i < n; i ++)
scanf("%d", & gear[i]);
for(int i = 1; i <= n; i ++)
{
flag = true;
for(int j = 0; j < n; j ++)
{
if(gear[j] == j)
continue;
else
{
flag = false;
break;
}
}
if(flag)
goto END;
for(int j = 0; j < n; j ++)
{
if(j % 2 == 0)
{
gear[j] ++;
if(gear[j] > n - 1)
gear[j] = 0;
}
else
{
gear[j] --;
if(gear[j] < 0)
gear[j] = n - 1;
}
}
}
END:
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
题意:第一行输入一个n。表示齿轮的数量。奇数下标齿轮顺时针转动,偶数下标齿轮逆时针转动。判断最后是否能能经过转动产生顺序数字012345.....可以输出Yes。
题解:改变数最多改变n次(第一个for循环),flag 判断是否找到。 第二个for循环 判断 是否符合题意01234....如果符合的话 可以直接goto跳出。如果不符合的话 就要继续变化。下标是从0开始的,所以偶数顺时针+1,奇数逆时针-1。如果顺时针+1超过n-1则变回0,如果逆时针-1小于0则变回n-1。