蛇梯棋(转载)

 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 }

 

posted @ 2016-09-26 18:31  SBSOI  阅读(778)  评论(0编辑  收藏  举报