| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4578 人关注过本帖
标题:青蛙过桥🐸
只看楼主 加入收藏
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 8楼 xzlxzlxzl
还没完呢~这题其实是老鼠走迷宫求最短路径的变种~上楼用了深度搜索求解~但深度搜索求最优解效率不大~有兴趣的可以做个广度搜索试试~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-02 08:45
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:0 
回复 10楼 九转星河
“b[MAX]={0,0,1,0,1,1,0,0,1,1};”应该只踩一坨,你代码又踩了两坨。
其实这题要得到最优解,试探肯定不行的,其实就是穷尽所有步长组合,就是遍历树形所有节点(步长2-3,就有两个子节点,2-4就有3个子节点),选中一个和石头坐标重合最少的路径即可。
遍历树形节点的代码量很少的,不复杂。
2017-03-02 08:47
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
收藏
得分:0 
本来想可以用二进制的0和1来记录石子与空缺,以及青蛙落脚处的,再让落脚处和石子位置按位与来计算。突然之间看到0<=L<=109...算了吧。再去想想...
2017-03-02 08:50
雨淋凉
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2017-3-1
收藏
得分:0 
回复 10楼 九转星河
多谢啦 (∩_∩)
2017-03-02 09:11
雨淋凉
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2017-3-1
收藏
得分:0 
还请各位大神帮忙看看 感激不尽
2017-03-02 09:17
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 12楼 xzlxzlxzl
10楼没有考虑到数据覆盖问题~引入了临时储存变量tempa即可解决~当然还是要感谢x版主仔细调试~不然错了都不知道呢~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-03-02 09:26
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
程序代码:
#include <stdio.h>
#include <limits.h>
#include <stdbool.h>

#define M 120

int main()
{
    int l, s, t, m, tmp, min;

    int bridge[M];  // which means the minimal stones at the position
    bool stone[M];

    // initialize
    for (int i = 0; i < M; ++i)
    {
        stone[i] = false;
        bridge[i] = INT_MAX;
    }

    // read data
    scanf("%d", &l);
    scanf("%d%d%d", &s, &t, &m);
    for (int i = 0; i < m; ++i)
    {
        scanf("%d", &tmp);
        stone[tmp] = true;
    }

    // move first step
    for (int i = s; i <= t; ++i)
    {
        bridge[i] = stone[i] ? 1 : 0;
    }

    // next step is determined by all the previous step
    for (int i = t + 1; i <= l; ++i)
    {
        min = INT_MAX;
        for (int j = s; j <= t; ++j)
        {
            if (i - j < 0) continue;
            if (min > bridge[i - j]) min = bridge[i - j];
        }
        if (stone[i] && min != INT_MAX) min += 1;

        bridge[i] = min;
    }

    // output the final step which determined by all the previous step
    min = INT_MAX;
    for (int i = l - t + 1; i <= l ; ++i)
    {
        if (min > bridge[i]) min = bridge[i];
    }
    printf("%d\n", min);

    return 0;
}


[fly]存在即是合理[/fly]
2017-03-02 09:34
普通的一员
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2017-3-1
收藏
得分:0 
回复 4楼 azzbcc
厉害
2017-03-02 10:24
雨淋凉
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2017-3-1
收藏
得分:0 
回复 17楼 azzbcc
大神 我们这个c++没有bool类型要怎么办呀 有什么办法可以替代嘛
2017-03-02 14:28
yslief
Rank: 5Rank: 5
来 自:水泊
等 级:职业侠客
帖 子:57
专家分:340
注 册:2016-11-14
收藏
得分:0 
程序代码:
#include<stdio.h>

int min=110;       //最多跳110步 
int b[111]={0};     //每一次成功走过桥头, 走过的索引下标值为1 
int L, S, T, M;
int i=0, j=0;    
int a[111]={0};         //如果有石子对应索引值为1 
    
void travel( int L, int present, int S, int T)  //S最小跳跃距离,T最大跳跃距离 
{
    int s=S, t=T;
    b[present]=1;               //
    if(present >= L)   //present当前位置, L最终位置 
    {
        int count=0, i=0;
        for(i=0; i <= L; i++)
        {
            if(b[i]==a[i]) 
            {
                count++;
            }
        }
        if(present == L)  count--;
        if(min > count)
        {
            min=count;
        }
        
        return ;
    }
    
    while(s <= t)       //改变跳跃的距离 
    {
        travel( L ,present+s, S, T);
        s++;
    }
    
    b[present] = 0;
    return ;
}
int main(void)
{

    scanf("%d%d%d%d", &L, &S, &T, &M);
    
    while(M--)
    {
        scanf("%d", &i);   //如果有石子对应索引值为1 
        a[i-1]=1;          //第n个石子下标为n-1 
    }
    travel( L, 0, S, T); 
    
    printf("\n%d", min-1);
    return 0;
}
2017-03-02 15:21
快速回复:青蛙过桥&#128056;
数据加载中...
 
   



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

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