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 ",step); 65 } 66 return 0; 67 }