Catch The Caw——(广度优先搜索的应用,队列)

抓住那头牛(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;
}

  

时间: 2024-07-28 13:26:12

Catch The Caw——(广度优先搜索的应用,队列)的相关文章

Catch That Cow(广度优先搜索_bfs)

 Catch That Cow Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 48036   Accepted: 15057 Description Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100

【算法导论】--C++实现广度优先搜索bfs

一.题目 根据上次随机生成的100个顶点的无向图和有向图,对其进行广度优先搜索. 二.理解广度优先搜索 广度优先搜索可以将其想象成水滴落入水面溅起了的一圈一圈的涟漪,是由一个起始点开始一圈一圈进行扩散搜索的. [课上老师是这样说的,大家想象一下,发现其实非常形象] 广度优先搜索总是从一个起始点出发,首先扩散这个点周围所有的邻居,然后邻居在去扩散邻居的邻居(*^-^*)...然后一直到最后将整张图都扩散完. 三.代码实现 对于第一次随机生成100个顶点的图进行了细节的修改,将每个顶点的类型改为了自

广度优先搜索-最少转机次数

当你和家人一起去海南旅游,可是你的城市并没有直接到达海南的飞机,但是你已经搜集了很多航班的信息,现在你希望找到一种乘坐方式,使得转机次数最少 如何解决呢? 假如你的城市在1号城市,海南在5号城市:现有如下关系: 如何求得1号城市到5号城市的最少转机次数呢?此时就用到了本次讲解的内容,广度优先搜索! 作图的问题首先我们应该用邻接矩阵或者二维数组来存取顶点之间的关系. 广度优先搜索需要用队列来存储每次扩展的关系. 首先将1号城市入队,通过1号城市我们可以扩展出2号和3号城市,2号城市又可以扩展出3号

leetcode_116题——Populating Next Right Pointers in Each Node(树,广度优先搜索)

Populating Next Right Pointers in Each Node Total Accepted: 49664 Total Submissions: 137310My Submissions Question Solution Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *next; } Populate each next po

leetcode_199题——Binary Tree Right Side View(广度优先搜索,队列queue)

#include<iostream> #include<queue> #include<vector> using namespace std; // Definition for binary tree struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; /*这道题采用广度优先搜索的算法来做

leetcode_226题——Invert Binary Tree(队列,广度优先搜索)

Invert Binary Tree Total Accepted: 22352 Total Submissions: 62065My Submissions Question Solution Invert a binary tree. 4 / 2 7 / \ / 1 3 6 9 to 4 / 7 2 / \ / 9 6 3 1 Trivia:This problem was inspired by this original tweet by Max Howell: Google: 90%

leetcode_107题——Binary Tree Level Order Traversal II (二叉树,广度优先搜索,队列,栈)

Binary Tree Level Order Traversal II Total Accepted: 37829 Total Submissions: 122499My Submissions Question Solution Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from le

迷宫问题 - 队列与广度优先搜索

队列也是一组元素的集合,也提供两种基本操作:Enqueue(入队)将元素添加到队尾,Dequeue(出队)从队头取出元素并返回.就像排队买票一样,先来先服务,先入队的人也是先出队的,这种方式称为FIFO(First In First Out,先进先出),有时候队列本身也被称为FIFO. 下面我们用队列解决迷宫问题.程序如下:(参考<linux c 编程一站式学习>) C++ Code 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 2

队列的JS实现及广度优先搜索(BFS)的实现

队列是先进先出(FIFO)的数据结构,插入操作叫做入队,只能添加在队列的末尾:删除操作叫做出队,只能移除第一个元素.在JS中,用数组可以很简单的实现队列. function Queue () { this.queue = []; } // 增加 Queue.prototype.enQueue = function(x) { this.queue.push(x); return true; } // 删除 Queue.prototype.deQueue = function() { if(this