算法-路上跳坑步数

发布于 2016-11-05 09:11:25 字数 54 浏览 1300 评论 2

一条路有k个坑,每次能跳平方数步长(1 4 9 16。。),不能跳到坑里,从a跳到b最少几步?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

灵芸 2017-09-07 10:44:40

输入a b n(坑的数量) 坑的数组 数字后面都有空格,测试了下,由于是遍历所有的可能,执行速度很慢
循环多次输入时a b n的值有时候a b n的值会异常,MS读缓冲区有问题,出现这个问题时重启下程序就好了。---求高手分析原因
如有错误请指出~

#include "stdafx.h"
#include <iostream>
#include <map>
#include <stack>
using namespace std;

#define MAX 100
int step[MAX];

typedef stack<int> stack_int;
map<int,stack_int> map_result;
stack_int g_stack;

bool bFirst;
void init_step()
{
for(int i = 1; i <= MAX ; ++i)
step[i - 1] = i * i;
}
bool chek(int a,int* k,int n)
{
if(!n)
return false;
for(int i = 0; i <= n ; ++i)
if (a == k[i])
return true;

return false;
}
void fun(int a,int b,int* k,int n)
{
if (!map_result.empty() && g_stack.size() > map_result.begin()->first)
{
return;
}
if (!bFirst && g_stack.empty())
{
return;
}
if(a > b)
return;

if (a == b)
{
map_result[g_stack.size()] = g_stack;
return;
}
if (chek(a,k,n))
return;

bFirst = false;
for(int i = 0; i <= MAX ; ++i)
{
if(a + step[i] > b)
return;
g_stack.push(step[i]);
fun(a + step[i],b,k,n);
g_stack.pop();
}
}

void main()
{
init_step();
int a,b,n;
while(true)
{
bFirst = true;

printf("请输入a,b,n:");
scanf("%d %d %d",&a,&b,&n);

while(b <= a || n < 0)
{
printf("请输入a,b,n:");
scanf("%d %d %d",&a,&b,&n);
}

int* k = new int[n];
for(int i = 0; i < n; ++i)
scanf("%d",&k[i]);

fun(a,b,k,n);

if (map_result.empty())
{
printf("n无法到达n");
}
else
{
int i = (map_result.begin())->first;
g_stack = (map_result.begin())->second;
printf("n步数:%dn",i);
printf("%d",b);
int temp = b;
while( i-- )
{
temp -= g_stack.top();
printf("t ( - %d ) %d", g_stack.top(),temp );
g_stack.pop();
}
printf("nn");
}
map_result.clear();
delete[] k;
}
}

浮生未歇 2017-01-13 08:47:35

个人觉得回溯法比较现实点

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文