2011百度之星初赛B圆环

       这是百度之星2011初赛B中的第一道题,题目也很水,只要找到解题思路就OK了。。

题目:

时间限制 :1000ms
描述
一个圆环上有 n 个位置,这 n 个位置按顺时针依次标号为1, 2, …, n 。初始时圆环的每个位置上都有一个1至 n 之间的整数,且每个整数只出现一次。
任何时刻,你可以将圆环上的数全部逆时针旋转一个位置,即第 i 个位置上的数变为原来第 i + 1 个位置上的数,第 n 个位置上的数变为原来第1个位置上的数。也可以将圆环上的数全部顺时针旋转一个位置,即第 i 个位置上的数变为原来第 i – 1 个位置上的数,第1个位置上的数变为原来第 n 个位置上的数。另有一个装置,可以交换圆环上第 a 个位置和第 b 个位置上的数。
下图给出了三种操作的示例,圆环上有6个位置,初始数字分别为1, 2, 4, 3, 5, 6,能交换第2个和第3个位置上的数。经过一次逆时针旋转后变为2, 4, 3, 5, 6, 1,交换后变为2, 3, 4, 5, 6, 1,再经过一次顺时针旋转后变为1, 2, 3, 4, 5, 6。
 
 

 
请问通过旋转和交换,能否使得第 i 个位置上的数正好是 i
 
输入
输入包含多组数据。
每组数据的第一行包含一个整数 n ,表示圆环上的数字个数。
第二行包含两个整数 a , b (1 ≤ a < b n ) ,表示可以交换圆环上第 a 个位置和第 b 个位置上的数。
接下来 n 行描述圆环上每个位置的初始值,其中第 i 行包含一个整数 ai ,表示初始时刻第 i 个位置上的数。
最后一组数据之后的一行为一个0,表示输入结束。
输出
对于每个测试用例,输出一行,如果能满足要求,这行中应只包含一个单词 Yes ,如果不能满足要求,这行中应只包含一个单词 No
样例输入
6
2 3
1
2
4
3
5
6
4
1 3
1
2
4
3
0
样例输出
Yes
No
提示
对于100%的数据,1 ≤ n ≤ 1,000

解法思路:

   首先我们定义“连通”的概念:如果在圆环中的位置可以互换,则我们认为这两个数是连通的。。。我们可以找到一个连通的一串数,则这串数中任意两个数是可以互换的。(why?自己证明把,很简单!)首先我们对每个数,找到他所属于的连通分支,然后从小到大进行排序。。。最后如果这些数能够组成连续的自然数,我们就认为这个圆环通过旋转和交换,能够使i的位置上的数是i。。

如图:

 

 

代码实现起来很容易,其实我也没写,希望有时间的同学可以写下。。。

你可能感兴趣的:(2011百度之星初赛B圆环,百度之星圆环)