1587: 空当接龙
内存限制:128 MB
时间限制:60.000 S
评测方式:文本比较
命题人:
提交:1
解决:0
题目描述
空当接龙可说是最耐玩的 Windows 小游戏之一。
如果你已经熟知其规则,可以跳过这段。
如图所示,空当接龙的游戏区由四个回收单元(右上),四个可用单元(左上)和一副牌组成(下面),游戏开始时,牌的正面朝上,排成八列。其中前四列各7张牌,后四列各6张牌。
每一步,你可以将一张纸牌从一个位置移动到另一个位置,但必须符合下述要求。
取牌规则
如果你已经熟知其规则,可以跳过这段。
如图所示,空当接龙的游戏区由四个回收单元(右上),四个可用单元(左上)和一副牌组成(下面),游戏开始时,牌的正面朝上,排成八列。其中前四列各7张牌,后四列各6张牌。
每一步,你可以将一张纸牌从一个位置移动到另一个位置,但必须符合下述要求。
取牌规则
- 下面的八列,只能取各列最下面(没有被其它牌压着)的牌移动。
- 可用单元中的牌可以取出。
- 回收单元中的牌不可取出。
- 将牌放到下面八列中时,必须按照从大 (K) 到小 (A) 的顺序依次摆放,并且红黑花色交替。比如图中第六列最下面那张牌是红桃9,那么,现在它的下面只能放梅花8 或者黑桃8。(当然就现在的局面而言,这两张牌都被压在牌堆里,不能这么移动。)
- 处于空闲状态的可用单元可以放置任意牌,每个可用单元只能放一张牌。
- 对于下面八列中的空列,其作用和可用单元相同,可以放置任意牌。
- 每个回收单元可以放多张牌,将牌放到回收单元时,必须按照从小 (A) 到大 (K) 的顺序依次摆放,并且花色相同。如果你在第一个回收单元里放了梅花A,那么接下来这里只能放入梅花2,然后才能是梅花3……依此类推。
输入
一副牌面,描述某一局的开始时局面。
一共一行,共 52 个数字,用空格隔开,以先行后列的顺序描述局面。图中局面对应 Sample Input。
牌和数字的对照如下:
一共一行,共 52 个数字,用空格隔开,以先行后列的顺序描述局面。图中局面对应 Sample Input。
牌和数字的对照如下:
梅花 | 方片 | 红桃 | 黑桃 | |
A | 0 | 1 | 2 | 3 |
2 | 4 | 5 | 6 | 7 |
3 | 8 | 9 | 10 | 11 |
4 | 12 | 13 | 14 | 15 |
5 | 16 | 17 | 18 | 19 |
6 | 20 | 21 | 22 | 23 |
7 | 24 | 25 | 26 | 27 |
8 | 28 | 29 | 30 | 31 |
9 | 32 | 33 | 34 | 35 |
10 | 36 | 37 | 38 | 39 |
J | 40 | 41 | 42 | 43 |
Q | 44 | 45 | 46 | 47 |
K | 48 | 49 | 50 | 51 |
输出
输出一种合法的移动方案,不要求移动步数最少,但请不要超过5000步(所有的测试数据都保证能在200步内完成)。
输出第一行为一个整数 n (n≤5000),表示一共移动了几步。
以下n行,每行两个数字,用空格隔开,第一个数表示牌移动前的位置,第二个数表示其移动的目的地。下方8列的编号依次为0到7,四个可用单元的编号为8到11,四个回收单元的编号为12到15。
注意,每次只能移动一张牌,每张牌都只会在你的安排下移动,不会像 Windows 中的空当接龙那样自动移到回收单元里。
输出第一行为一个整数 n (n≤5000),表示一共移动了几步。
以下n行,每行两个数字,用空格隔开,第一个数表示牌移动前的位置,第二个数表示其移动的目的地。下方8列的编号依次为0到7,四个可用单元的编号为8到11,四个回收单元的编号为12到15。
注意,每次只能移动一张牌,每张牌都只会在你的安排下移动,不会像 Windows 中的空当接龙那样自动移到回收单元里。
样例输入 复制
22 38 12 14 7 9 32 31 43 28 35 25 20 16 3 24 41 44 10 51 40 5 36 37 21 39 11 15 27 47 23 13 19 2 29 8 33 49 48 6 50 17 4 1 45 34 0 30 42 46 26 18
样例输出 复制
109
1 8
1 9
1 14
3 10
7 11
1 0
3 13
5 0
1 5
1 0
2 0
6 12
2 12
3 12
7 14
8 6
2 8
2 7
2 14
2 1
2 12
11 1
5 11
5 2
5 2
5 13
5 12
5 13
9 5
3 5
6 3
6 9
6 0
10 0
1 10
5 0
8 1
7 8
7 13
5 13
6 5
6 15
1 6
1 7
6 7
6 1
4 6
4 5
4 7
4 3
3 6
4 12
4 15
8 15
0 15
3 8
3 4
8 4
3 8
3 14
0 14
10 1
7 1
7 3
7 10
7 6
7 12
7 5
0 7
0 5
0 12
7 5
0 7
10 6
0 10
0 2
3 6
0 3
0 15
0 13
5 15
1 15
8 13
5 8
5 15
6 13
5 13
6 15
6 13
0 13
10 15
0 15
0 14
8 14
1 14
1 12
5 12
6 12
6 13
7 14
1 14
2 14
2 15
2 13
4 14
3 14
4 15
11 12
9 12
提示
你可以用下面的代码生成测试数据,输入的数据为关卡编号,输出的为局面(同 Windows 自带的空当接龙生成的局面相同)。
本题共选用了其中的 6 个局面作为测试数据。
#include<stdio.h> #include<stdlib.h> int main(){ int i,t; scanf("%d",&t); srand(t); int a[52]; for(i=0;i<52;i++) a[i]=i; for(i=52;i>1;i--){ t=rand()%i; printf("%d ",a[t]); a[t]=a[i-1]; } printf("%d ",a[0]); }