抓住那头牛(POJ3278)
农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上
,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000)
。农夫有两种移动方式:
1、从X移动到X-1或X+1,每次移动花费一分钟
2、从X移动到2*X,每次移动花费一分钟
假设牛没有意识到农夫的行动,站在原地不动。农夫最少要
花多少时间才能抓住牛?

广搜算法
广度优先搜索算法如下:(用QUEUE)
(1) 把初始节点S0放入Open表中;
(2) 如果Open表为空,则问题无解,失败
退出;
(3) 把Open表的第一个节点取出放入
Closed表,并记该节点为n;
(4) 考察节点n是否为目标节点。若是,
则得到问题的解,成功退出;
(5) 若节点n不可扩展,则转第(2)步;
(6) 扩展节点n,将其不在Closed表和
Open表中的子节点(判重) 放入Open表的尾部
, 并为每一个子节点设置指向父节点的指针(
或记录节点的层次) ,然后转第(2)步。

#include<iostream>
#include<queue>
#include<string>
#include<malloc.h>
using namespace std;

#define MAX_SIZE 10000//查询最大的范围
int visited[MAX_SIZE];//标记那个位置是否已经走过了
struct Node
{
	int x;//位置
	int step;//走到这个位置所需要几步
	Node(int a=0,int b=0):x(a),step(b){}
};

queue<Node> open;

//广度优先搜索,类似于一层一层的去遍历查找
int main()
{
	cout<<"输入农夫的位置N(0<=N<=100000):"<<endl;
	int N;
	cin>>N;
	cout<<"输入牛的位置K(0<=K<=100000):"<<endl;
	int K;
	cin>>K;

	memset(visited,0,sizeof(visited));
	Node N_start(N,0);//人位置.
	Node K_caw(K,0);//牛位置.
	int min_step;//最终的最少的步骤.
	Node N_step(0,0);//中间存储变量.

	N_step=N_start;
	open.push(N_step);//将开始的位置输入到队列中
	visited[N_start.x]=1;

	while(!open.empty())
	{
		N_step=open.front();//取出队列头的元素,进行判断
		open.pop();
		if(N_step.x==K)//若是找到了则跳出循环
		{
			min_step=N_step.step;
			break;
		}
		else
		{
			//加1的位置元素
			if((N_step.x+1<MAX_SIZE)&&visited[N_step.x+1]==0)
			{
				visited[N_step.x+1]=1;
				open.push(Node(N_step.x+1,N_step.step+1));
			}
			if(N_step.x-1>=0&&visited[N_step.x-1]==0)//减1的位置元素
			{
				visited[N_step.x-1]=1;
				open.push(Node(N_step.x-1,N_step.step+1));
			}
			if(N_step.x*2<MAX_SIZE&&visited[N_step.x*2]==0)//*2的位置的元素
			{
				visited[N_step.x*2];
				open.push(Node(N_step.x*2,N_step.step+1));
			}
		}
	}
	cout<<min_step<<endl;
	system("pause");
	return 1;
}

  

最新文章

  1. StrangeIoc框架学习----在项目中实战
  2. SSRS开发的经验记录
  3. jsp中 response和request区别
  4. 最近在研究电台类app,分享2个源码大家一起讨论
  5. Sass函数--字符串函数
  6. Vim 第一天
  7. 【翻译】在Visual Studio中使用Asp.Net Core MVC创建第一个Web Api应用(二)
  8. ER图是啥?
  9. sqlserver删除重复的数据
  10. linux忘记密码/修改密码
  11. 【VMware Workstation】虚拟机静态IP NAT连接外部网络(局域网以及广域网)
  12. C#爬虫使用代理刷csdn文章浏览量
  13. war包安装jenkins
  14. MVC的开发模式简单介绍
  15. vue--vConsole
  16. 6.分析request_irq和free_irq函数如何注册注销中断(详解)
  17. 关于ArcGIS常用功能的实现
  18. C# 中的 ConfigurationManager类引用方法
  19. 尚硅谷springboot学习22-Thymeleaf入门
  20. KVM虚拟化技术(六)磁盘管理

热门文章

  1. Android 常见的工具类
  2. 暑假集训 || 区间DP
  3. zabbix user-defined item
  4. Spring Data Redis入门示例:程序配置(五)
  5. docker 离线安装
  6. cc.Component
  7. 如何用纯 CSS 创作文本滑动特效的 UI 界面
  8. 条款36:绝不重新定义继承而来的non-virtual函数(Never redefine an inherited non-virtual function)
  9. github 获取 token
  10. day23 01 类的命名空间