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 |
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;
}