博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ3278 HDU2717 Catch That Cow
阅读量:7244 次
发布时间:2019-06-29

本文共 1737 字,大约阅读时间需要 5 分钟。

USACO 2007 Open Silver

问题链接:。

题意简述:一条线上,人的FJ的起点为K位置,牛在N位置(牛不动),输入正整数K和N。若FJ在x位置,FJ有三种走法,分别是走到x-1、x+1或2x位置。求从K走到N的最少步数。

问题分析:典型的BFS问题。在BFS搜索过程中,走过的点就不必再走了,因为这次再走下去不可能比上次的步数少。

程序说明

程序中,使用了一个队列来存放中间节点。

需要说明的是,除了BFS方法,这个题应该可以用分支限界法来解,需要更高的技巧。

AC的C++语言程序如下:

/* POJ3278 HDU2717 Catch That Cow */#include 
#include
#include
using namespace std;const int MAXN = 100000;const int MAXN2 = MAXN * 2;bool notvist[MAXN * 2 + 2];int n, k, ans;struct node { int p, level;};node start;void bfs(){ queue
q; int nextp; memset(notvist, true, sizeof(notvist)); notvist[n] = false; start.p = n; start.level = 0; ans = 0; q.push(start); while(!q.empty()) { node front = q.front(); q.pop(); if(front.p == k) { ans = front.level; break; } nextp = front.p - 1; /* x-1 */ if(nextp >= 0 && notvist[nextp]) { notvist[nextp] = false; node v; v.p = nextp; v.level = front.level + 1; q.push(v); } nextp = front.p + 1; /* x+1 */ if(nextp <= MAXN2 && notvist[nextp]) { notvist[nextp] = false; node v; v.p = nextp; v.level = front.level + 1; q.push(v); } nextp = front.p + front.p; /* 2x */ if(nextp <= MAXN2 && notvist[nextp]) { notvist[nextp] = false; node v; v.p = nextp; v.level = front.level + 1; q.push(v); } }}int main(){ while(cin >> n >> k) { bfs(); printf("%d\n", ans); } return 0;}

转载于:https://www.cnblogs.com/tigerisland/p/7564447.html

你可能感兴趣的文章
openstack目前个人认为要解决的问题总结,会持续更新
查看>>
我的友情链接
查看>>
iops计算详解
查看>>
Android编译报R.java报不到的错误解决办法
查看>>
CentOS5.x下安装配置FTP服务器
查看>>
正则数量词及非捕获
查看>>
MPLS 配置步骤
查看>>
Exchange Server 2007灾难恢复(AD+Ex)
查看>>
GRUB2
查看>>
Go性能优化技巧 1/10
查看>>
DNS 域名解析服务器---案例详解
查看>>
疑似电信版GALAXY S4现身官网 或配八核处理器
查看>>
我的Linux生涯之系统语言环境及中文输入法的操作
查看>>
c#获取当前页面名字
查看>>
客户端自动化技术漫谈
查看>>
mysql 优化之 查询
查看>>
TCP协议中的三次握手和四次挥手(图解)
查看>>
YII assets使用
查看>>
未来已来——工作空间 WorkSpace 和物联网 IoT (2)
查看>>
从零开始玩人工智能-机器人服务-05
查看>>