河南省第二届程序设计大赛 第一题 Dr.Kong的机器人

Dr.Kong机器人

Dr.Kong设计了一个可以前进或后退机器人,该机器人在每个位置i会得到一个移动步数的指令Ki (i=1,2N),聪明的机器人自己会判断是要前进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


DFS搜索


#include <iostream> 
#include<cstring>
using namespace std; 
int a[52],N,Min,used[52];
void Dfs(int x,int y,int c){
 used[x]=1;
 if(x==y){
  if(c<Min)Min=c;
 }
 if(c>Min)return;
 if(x-a[x]>=1&&used[x-a[x]]==0){
  Dfs(x-a[x],y,c+=1);
  used[x]=0;
 }
 if(x+a[x]<=N&&used[x+a[x]]==0){
  Dfs(x+a[x],y,c+=1);
  used[x]=0;
 }
}
int main() 

   int test,A,B;
   scanf("%d",&test);
   while(test--){
    scanf("%d%d%d",&N,&A,&B);
    memset(used,0,sizeof(used));
    for(int i=1;i<=N;i++)scanf("%d",&a[i]);
    Min=100000;
    Dfs(A,B,0);
    if(Min!=100000)printf("%d\n",Min);
    else printf("-1\n");
   }
   return 0;




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值