1587: 空当接龙

内存限制:128 MB 时间限制:60.000 S
评测方式:文本比较 命题人:
提交:1 解决:0

题目描述

  空当接龙可说是最耐玩的 Windows 小游戏之一。


  如果你已经熟知其规则,可以跳过这段。
  如图所示,空当接龙的游戏区由四个回收单元(右上),四个可用单元(左上)和一副牌组成(下面),游戏开始时,牌的正面朝上,排成八列。其中前四列各7张牌,后四列各6张牌。
  每一步,你可以将一张纸牌从一个位置移动到另一个位置,但必须符合下述要求。
  取牌规则
  1. 下面的八列,只能取各列最下面(没有被其它牌压着)的牌移动。
  2. 可用单元中的牌可以取出。
  3. 回收单元中的牌不可取出。
  放牌规则
  1. 将牌放到下面八列中时,必须按照从大 (K) 到小 (A) 的顺序依次摆放,并且红黑花色交替。比如图中第六列最下面那张牌是红桃9,那么,现在它的下面只能放梅花8 或者黑桃8。(当然就现在的局面而言,这两张牌都被压在牌堆里,不能这么移动。)
  2. 处于空闲状态的可用单元可以放置任意牌,每个可用单元只能放一张牌。
  3. 对于下面八列中的空列,其作用和可用单元相同,可以放置任意牌。
  4. 每个回收单元可以放多张牌,将牌放到回收单元时,必须按照从小 (A) 到大 (K) 的顺序依次摆放,并且花色相同。如果你在第一个回收单元里放了梅花A,那么接下来这里只能放入梅花2,然后才能是梅花3……依此类推。
  把所有的牌都移动到回收单元即可获胜,最后的胜利局面中,四个回收单元中分别是四种花色的从 (A) 到 (K) 的序列。你的任务是给出一种合法的解决方案。

输入

  一副牌面,描述某一局的开始时局面。
  一共一行,共 52 个数字,用空格隔开,以先行后列的顺序描述局面。图中局面对应 Sample Input。
  牌和数字的对照如下:
梅花方片红桃黑桃
A0123
24567
3891011
412131415
516171819
620212223
724252627
828293031
932333435
1036373839
J40414243
Q44454647
K48495051

输出

  输出一种合法的移动方案,不要求移动步数最少,但请不要超过5000步(所有的测试数据都保证能在200步内完成)。
  输出第一行为一个整数 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]);
}