Dr.Kong的机器人
Dr.Kong设计了一个可以前进或后退机器人,该机器人在每个位置i会得到一个移动步数的指令Ki (i=1,2„N),聪明的机器人自己会判断是要前进Ki步还是后退Ki步。
例如:给定指令序列(3 3 1 2 5),表示机器人在第1个位置时,可以前进3步到第4个位置,此时后退是不起作用的,出界;机器人在第2个位置时,可以前进3步到第5个位置,此时后退是不起作用的,出界;机器人在第3个位置时,可以前进1步到第4个位置,也可以后退1步到第2个位置等等。
你认为,对给定的两个位置A,B, 聪明的机器人从A位置走到B位置至少要判断几次?
【标准输入】
第一行: M 表示以下有M组测试数据(0<M<=8)
接下来每组有两行数据
头一行:N A B ( 1≤ N≤ 50, 1≤A,B ≤N )
下一行: K1 K2„..Kn ( 0<=Ki<=N )
【标准输出】
输出有M行,第i行为第i组测试数据的最少判断次数, 若无法到达,则输出-1。
【 样 例 】
标准输入
标准输出
2
5 1 5
3 3 1 2 5
8 5 3
1 2 1 5 3 1 1 1
3
-1
1 #include<stdio.h> 2 int loc[55]; 3 int A,B,N,cnt,curLoc,min; 4 int f(int n) 5 { 6 if(n>(B-A+1)) return 0; 7 if(curLoc==B){ 8 if(min>n) min=n; 9 return 1; 10 }else{ 11 int t=loc[curLoc]; 12 curLoc+=t; 13 if(curLoc<=B) 14 if(f(n+1)) return 1; 15 curLoc-=2*t; 16 if(curLoc>=A) 17 if(f(n+1)) return 1; 18 curLoc+=t; 19 } 20 return 0; 21 } 22 int main() 23 { 24 int i,M; 25 scanf("%d",&M); 26 while(M--){ 27 min=0xffff; 28 scanf("%d%d%d",&N,&A,&B); 29 if(A>B){ 30 int t=A; 31 A=B; 32 B=t; 33 } 34 for(i=A;i<=B;i++) 35 scanf("%d",&loc[i]); 36 curLoc=A; 37 if(f(0)) printf("%d\n",min); 38 else printf("-1\n"); 39 } 40 while(1); 41 return 0; 42 }
用的DFS搜索的,出口是找到终点,或者是搜索次数大于a-b长度,不知这样对不对,反正测试数据是过了,网上查的使用BFS,感觉都一样吧!