标题:一道新手遇见的难题
只看楼主
飞天的猪
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:67
专家分:141
注 册:2009-9-19
结帖率:66.67%
已结贴  问题点数:20 回复次数:8 
一道新手遇见的难题
    有人设计了一个可以前进或后退的机器人,该机器人在每个位置i会得到一个移动的指令Ki(i=1,2,3……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行,第行为第组测试数据的最少判断次数,若无法到达,则输出-1。
【样例】
标准输入              标准输出
2                     3
5 1 5
3 3 1 2 5             -1
8 5 3
1 2 1 5 3 1 1 1

先说谢谢



搜索更多相关主题的帖子: 难题 遇见 
2009-09-27 22:12
jedypjd
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:9
帖 子:1096
专家分:4969
注 册:2009-7-27
得分:3 
是acm题?

天涯无岁月,歧路有风尘,百年浑似醉,是非一片云
2009-09-27 22:18
lansong
Rank: 4
等 级:业余侠客
帖 子:79
专家分:226
注 册:2009-6-11
得分:1 
BFS就可以解决了
2009-09-27 22:30
飞天的猪
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:67
专家分:141
注 册:2009-9-19
得分:0 
是的,我想训练训练,明年参加ACM,
唉…………
第一个就不会,一点都不懂……
2009-09-27 22:32
lansong
Rank: 4
等 级:业余侠客
帖 子:79
专家分:226
注 册:2009-6-11
得分:1 
给个网址?
2009-09-27 22:33
飞天的猪
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:67
专家分:141
注 册:2009-9-19
得分:0 
在百度上搜的,连接了好几下,最后不知连接到哪儿了,我这儿有JPG格式的试题,
上面的是我用WORD一字一字打上去的,
呵呵
2009-09-27 22:52
lansong
Rank: 4
等 级:业余侠客
帖 子:79
专家分:226
注 册:2009-6-11
得分:15 

//#include<stdio.h>
#include<iostream>
#include<string.h>
#include<queue>
 
using namespace std;
 
struct nod{
    int pos;
    int step;
    int depth;
};
 
 
const int N=50;
 
int flag[N];
int k[N];
 
int n;
int start;
int end;
 
int min;
 
void init(void)
{
    memset(flag,0,sizeof(flag));
 
    cin >> n >> start >> end;
 
    int i=1;
    int m=n;
    while(m--)
    {
        cin >> k[i];
        i++;
    }
}
 
 
int find(void)
{
    queue <nod> que;
    struct nod s,r;
    int pos,step,depth;
    s.pos = 1;
    s.step = k[1];
    s.depth = 1;
    que.push(s);
    flag[1]=1;
 
    min = -1;
    while(!que.empty())
    {
        r=que.front();
        que.pop();
        pos=r.pos;
        step=r.step;
        depth=r.depth;
        if(pos+step==end||pos-step==end)
        {
            min=r.depth;
            return 1;
        }
        //min++;
        if((pos + step<=n) && (!flag[pos+step]))
        {
            r.pos = r.pos + step;
            r.step = k[r.pos];
            r.depth++;
            flag[r.pos] = 1;
            que.push(r);
        }
        if((pos-step>0) && (!flag[pos-step]))
        {
            r.pos = r.pos - step;
            r.step = k[r.pos];
            r.depth++;
            flag[r.pos] = 1;
            que.push(r);
        }
 
    }
    return 0;
     
}
 
 
void solve(void)
{
     
    init();
    if(find())
    {
        cout << min << endl;
    }
    else
    {
        cout << min << endl;
    }
 
}
 
int main()  
{  
 
    int tase;
    cin >> tase;
 
    while(tase--)
    {
        solve();
    }
 
    return 0;
}
2009-09-27 23:32
lansong
Rank: 4
等 级:业余侠客
帖 子:79
专家分:226
注 册:2009-6-11
得分:0 
自己学学吧,不懂得话,自己看书
2009-09-27 23:32
飞天的猪
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:67
专家分:141
注 册:2009-9-19
得分:0 
回复 8楼 lansong
好的,谢谢了
真牛!!
2009-09-27 23:38



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-287114-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.512872 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved