• 第二届河南省大学生程序设计竞赛 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,感觉都一样吧!

  • 相关阅读:
    ubuntu 安装 Java 开发环境
    mtd-utils 的 使用
    容器技术与虚拟化技术
    Shell之作业控制
    Shell常用语句及结构
    Shell常用命令之read
    Shell之函数
    文件的copy
    类中调用初始化方法
    父类中的方法被覆盖以及子类调用父类覆盖的方法
  • 原文地址:https://www.cnblogs.com/shihuajie/p/3043554.html
Copyright © 2020-2023  润新知