首页 > 代码库 > 蛇梯棋(转载)

蛇梯棋(转载)

 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 2510 3 23 5 16 20 3311 */12 13 #include<stdio.h>14 #include<string.h>15 #define NMAX 2016 #define SLMAX 20017 struct SandL18 {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 }

 

蛇梯棋(转载)