当前位置: 首页 > news >正文

STL应用 —— queue(队列)

STL应用 —— queue(队列)

队列(queue)只允许从队尾入队、从队头出队,不允许在中间位置插入和删除,不支持数组表示法和随机访问。使用queue时需要引入头文件#include<queue>。队列的基本操作很简单,包括入队、出队、取队头、判断队空、求队列大小。
  • queue<int>q:创建一个空队,数据类型为int
  • push(x):x入队
  • pop():出队
  • front():取队头(不出队)
  • empty():判断队列是否为空,若为空,返回true
  • size():求队列大小,返回队列中的元素个数。

举个栗子

POJ No. 1915

官方题目地址

在这里插入图片描述

题意:

编写程序,计算骑士从一个位置移动到另一个位置所需的最少移动次数。

移动规则:

在这里插入图片描述

样例:

输入:输入的第1行为测试用例的个数N 。每个测试用例都包含3行。第1行表示棋盘的长度L (4≤L ≤300),棋盘的大小为L ×L ;第2行和第3行包含一对{0,…,L -1}×{0,…,L -1}的整数,表示骑士在棋盘上的起始位置和结束位置。假设这些位置是该棋盘上的有效位置。

输出:

对于每个测试用例,都单行输出骑士从起点移动到终点所需的最少移动次数。如果起点和终点相等,则移动次数为0。

在这里插入图片描述

在这里插入图片描述

算法设计

→ 使用queue进行广度优先搜索。

步骤:

  • 如果起点正好等于终点,返回0
  • 将起点放入队列
  • 如果队列不空,则队头出队,否则扩展8个方向,如果找到目标,则立即返回步长 + 1,否则判断是否越界;如果没有越界,则将步长 + 1放入队列,标记其已访问。如果当前骑士的位置是(x , y),则移动时当前位置坐标加上偏移量即可。

在这里插入图片描述

8个方向的位置偏移:

int dx[8] = {-2 , -2 , -1, -1 , 1, 1 , 2, 2};  //行偏移量
int dy[8] = {1 ,  -1,   2 ,-2 , 2 ,-2 ,1,-1};  //列偏移量

//也可以用一个二维数组
int dir[8][2] = {-2,-1,-2,1,-1,-2,-1,2,1,-2,1,2,2,-1,2,1} 表示位置偏移

算法实现

#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
#include<cstdio>

const int maxN = 310;

using namespace std;

struct point{ //到达的点和需要的步数 
	int x , y;
	int step;
};

int dx[8] = {-2,-2,-1,-1,1,1,2,2}; //行偏移量 
int dy[8] = {1,-1,2,-2,2,-2,1,-1}; //列偏移量

bool visited[maxN][maxN];

int sx , sy , ex , ey ,tx , ty ,L;

int bfs(){
	
	if(sx == ex && sy == ey){
		return 0;
	}
	
	memset(visited , false , sizeof(visited)); //初始化是否已访问数组
	
	queue<point>Q;
	
	point start , node;
	
	start.x = sx;
	
	start.y = sy;
	
	start.step = 0;  //队列初始化
	
	Q.push(start); //压入队列
	
	int step , x , y;
	
	while(! Q.empty()){
		start = Q.front() , Q.pop(); //取队列头元素,同时把这个元素弹出
		x = start.x;
		y = start.y;
		
		step = start.step; //将队列头元素的x , y , step取出
		
		for(int i = 0 ; i < 8 ; i ++){
			tx = x + dx[i];
			ty = y + dy[i];
			
			if(tx == ex && ty == ey){
				return step + 1;
			}
			if(tx >= 0 && tx < L && ty >= 0 && ty < L && !visited[tx][ty]){
				node.x = tx;
				node.y = ty;
				
				node.step = step + 1;
				Q.push(node); //满足条件的进队 
				visited[tx][ty] = true;
			}
		} 
		
	} 
}


int main(){
	
	int N;
	scanf("%d" , &N);
	
	while(N --){
		scanf("%d" , &L);
		scanf("%d%d",&sx , &sy);
		scanf("%d%d",&ex,&ey);
		printf("%d\n",bfs());
	}
	
	return 0;
} 

运行结果

在这里插入图片描述

相关文章:

  • 【计算机网络】OSI七层网络参考模型
  • 第二十章 控制进程(一)
  • 移动Web第四天 1 移动适配
  • JavaFx 实现按钮防抖和软件重启(Kotlin)
  • 2022年全国最新消防设施操作员(高级消防设施操作员)真题题库及答案
  • Rest学习环境搭建笔记
  • JavaScript-DOM节点的相关操作
  • 猿创征文|HCIE-Security Day49:AC准入控制SACG
  • 移动Web第二天 4 空间转换 5 动画
  • LeetCode646-最长数队链
  • 力扣:23,-合并K个升序链表
  • 移动Web第三天 1 移动端特点 2 百分比布局 3 Flex布局
  • vue中用ref实现父子组件、孙组件、兄弟组件、非亲子孙组件互相调用的方法
  • 【信号去噪】基于鲸鱼算法优化VMD实现信号去噪附matlab代码
  • git开发分支管理
  • [Vue CLI 3] 配置解析之 css.extract
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • CentOS6 编译安装 redis-3.2.3
  • CSS居中完全指南——构建CSS居中决策树
  • CSS实用技巧干货
  • dva中组件的懒加载
  • Electron入门介绍
  • Facebook AccountKit 接入的坑点
  • Javascript 原型链
  • JS实现简单的MVC模式开发小游戏
  • log4j2输出到kafka
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • Service Worker
  • vagrant 添加本地 box 安装 laravel homestead
  • vue的全局变量和全局拦截请求器
  • webpack入门学习手记(二)
  • 编写符合Python风格的对象
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 解析带emoji和链接的聊天系统消息
  • 算法系列——算法入门之递归分而治之思想的实现
  • 在Docker Swarm上部署Apache Storm:第1部分
  • - 转 Ext2.0 form使用实例
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • %check_box% in rails :coditions={:has_many , :through}
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (33)STM32——485实验笔记
  • (ibm)Java 语言的 XPath API
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .net操作Excel出错解决
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件