第二届河南省大学生程序设计竞赛 Dr.Kong的机器人

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,感觉都一样吧!

原文地址:https://www.cnblogs.com/shihuajie/p/3043554.html