1 //题目的大概意思是又N*N的棋盘,编号从1 到 N*N 棋盘中分布着蛇和梯子玩家在位置1处,
2 //然后掷骰子,如果点数在梯子尾则顺着梯子到达梯子头,若掷到蛇头,则滑到蛇尾
3 //问最快到达终点所需掷的次数...
4 // 输入描述: 1表示1组数据,6 1 3分别表示棋盘大小,蛇的个数和梯子的个数
5 //35 25 表示蛇的头和尾巴 最后一行表示各个梯子的头和尾
6 /*
7 1
8 6 1 3
9 35 25
10 3 23 5 16 20 33
11 */
12
13 #include<stdio.h>
14 #include<string.h>
15 #define NMAX 20
16 #define SLMAX 200
17 struct SandL
18 {
19 int from,to;
20 };
21 int main()
22 {
23 int D,N,S,L;
24 int grid[NMAX*NMAX+1];
25 int gridbak[NMAX*NMAX+1];
26 SandL jk[2*SLMAX];
27 int n,i,j,k,m;
28 int step,deal;
29 scanf("%d",&D);
30 for(i=0;i<D;i++)
31 {
32 scanf("%d%d%d",&N,&S,&L);
33 for(j=0;j<S+L;j++)
34 scanf("%d%d",&jk[j].from,&jk[j].to);
35 memset(grid,0,sizeof(grid));
36 grid[1]=1;
37 step=0;
38 while(grid[N*N]==0)
39 {
40 memcpy(gridbak,grid,sizeof(grid));
41 memset(grid,0,sizeof(grid));
42 for(j=1;j<N*N-1;j++)
43 {
44 if(gridbak[j]==0)
45 continue;
46 for(k=1;k<=6;k++)
47 {
48 deal=0;
49 if(j+k>N*N)
50 break;
51 for(m=0;m<S+L;m++)
52 if(jk[m].from==j+k)
53 {
54 grid[jk[m].to]=1;
55 deal=1;
56 break;
57 }
58 if(deal==0&&grid[j+k]==0)
59 grid[j+k]=1;
60 }
61 }
62 step++;
63 }
64 printf("%d\n",step);
65 }
66 return 0;
67 }