队列模拟基本操作I

看到这道题,第一个想法就是“搜索”!“回溯”!的确,这种思路是很正确的,BFS和DFS都可以来解决:
#include <cstdlib>
#include <cstring>
#include <iostream>
using namespace std;
int dx[]= {-,-,-,,,,,,,-,-,-},
dy[]= {-,-,-,-,-,-,,,,,,};
int main() {
int s[][],que[][]= {},x1,y1,x2,y2;
memset(s,0xff,sizeof(s)); //s数组的初始化
int head=,tail=; //初始位置入队
que[][]=;
que[][]=;
que[][]=;
cin>>x1>>y1>>x2>>y2; //读入黑马和白马的出发位置
while(head<=tail) { //若队列非空,则扩展队首结点
for(int d=; d<=; d++) { //枚举12个扩展方向
int x=que[head][]+dx[d]; //计算马按d方向跳跃后的位置
int y=que[head][]+dy[d];
if(x>&&y>)
if(s[x][y]==-) { //若(x,y)满足约束条件
s[x][y]=que[head][]+; //计算(1,1)到(x,y)的最少步数
tail++; //(1,1)至(x,y)的最少步数入队
que[tail][]=x;
que[tail][]=y;
que[tail][]=s[x][y];
if(s[x1][y1]>&&s[x2][y2]>) { //输出问题的解
cout<<s[x1][y1]<<endl;
cout<<s[x2][y2]<<endl;
system("pause");
return ;
}
}
} head++;
}
return ;
}
咱们来模拟以下队列的操作:
首先,初始化一个队列(拿脑子想出了一个队列……),然后,定义头指针head和尾指针tail都为1。

如果尾指针在head的位置上或者head的前面,则这个queue不是空的或者这个队列中的元素还没有完全处理完。
相反,判断一个队列是否为空或者其中的元素是否全部处理完毕,那就可以用 tail > head 来判断了。
当有新的元素加入进来,旧的元素不要就可以tail+1,尾指针向上移一位。
当然,你也可以用STL的序列式容器queue,也是根据个人习惯的。
但是……
这道题有个bug。
我们不妨来倒推,它要去(1,1)这个点,我们就从(1,1)这个点去(x,y)这个位置。
当我们统计每一个坐标点都能走几步能到达时,得到了这个图:

可以看出当行数和列数都小于等于5的时候是没有规律的,但当行数和列数是大于5的时候,是以两个为单位依次递增,也就是第六、第七列是3,第八、第九列是4,第十、第十一是5……然后再在1到5之内特判一下,就可以得到了:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
int x,y,k;
for(int i=;i<=;i++)
{
cin>>x>>y;
if(x<=&&y<=)
{
if((x==&&y>=&&y<=)||(y==&&x>=&&x<=)||(x==&&y>=&&y<=)||(y==&&x>=&&x<=)||x==&&y==||x==&&y==||x==&&y==)
printf("");
if(x==&&y==||x==&&y==||x==&&y==)
printf("");
if(x==&&(y>=&&y<=)||x==&&y==)
printf("");
if(x==&&y==)
printf("");
}
else
{
for(int i=,k=;i<=max(x,y);i+=,k++)
{
if(max(x,y)==i)
printf("%d ",k);
}
}
}
return ;
}
队列模拟基本操作I的更多相关文章
- Codeforces 704A Thor 队列模拟
题目大意:托尔有一部手机可执行三种操作 1.x APP产生一个新消息 2.读取x App已产生的所有消息 3.读取前t个产生的消息 问每次操作后未读取的消息的数量 题目思路: 队列模拟,坑点在于竟然卡 ...
- 二、 编写一个类,用两个栈实现队列,支持队列的基本操作(add,poll,peek)
请指教交流! package com.it.hxs.c01; import java.util.Stack; /* 编写一个类,用两个栈实现队列,支持队列的基本操作(add,poll,peek) */ ...
- python--递归(附利用栈和队列模拟递归)
博客地址:http://www.cnblogs.com/yudanqu/ 一.递归 递归调用:一个函数,调用的自身,称为递归调用 递归函数:一个可以调用自身的函数称为递归函数 凡是循环能干的事,递归都 ...
- PTA 银行排队问题之单队列多窗口加VIP服务 队列+模拟
假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙.当有窗口空闲时,下一位顾客即去该窗口处理事务.当有多个窗口可选择时,假设顾客总是选择编号最小的窗口. 有些银行会给 ...
- 原生JS实现队结构及利用队列模拟‘击鼓传花’游戏
1. 前言 队列,是一种遵从先进先出(FIFO,First-In-First-Out)原则的有序集合.队列在尾部添加新元素,并从顶部移除元素,最新添加的元素必须排在队列的末尾. 2.功能说明 enqu ...
- 两队列模拟一个栈,python实现
python实现两个队列模拟一个栈: class Queue(object): def __init__(self): self.stack1=[] self.stack2=[] def enqueu ...
- hdu-5929 Basic Data Structure(双端队列+模拟)
题目链接: Basic Data Structure Time Limit: 7000/3500 MS (Java/Others) Memory Limit: 65536/65536 K (Ja ...
- uva 12100 Printer Queue 优先级队列模拟题 数组模拟队列
题目很简单,给一个队列以及文件的位置,然后一个一个检查,如果第一个是优先级最高的就打印,否则放到队列后面,求所要打印的文件打印需要花费多长时间. 这里我用数组模拟队列实现,考虑到最糟糕的情况,必须把数 ...
- [Swust OJ 352]--合并果子(贪心+队列模拟)
题目链接:http://acm.swust.edu.cn/problem/352/ Time limit(ms): 1000 Memory limit(kb): 65535 Description ...
随机推荐
- sqlbulkcopy 多表批量保存
/// <summary> /// 批量保存多表 /// </summary> /// <param name="dt1"></param ...
- Nginx负载均衡NFS配置
Nginx配置 首先在两台服务器上部署同一个项目,例如下: 测试网站节点1: http://192.168.168.61/nfstest/ 测试网站节点2: http://192.168.64.145 ...
- JavaScript 同步异步示意图
- 关于expect的实战总结
如何从机器A上ssh到机器B上,然后执行机器B上的命令?如何使之自动化完成?看完下面的文章你就明白了 一.安装 expect 是基于tcl 演变而来的,所以很多语法和tcl 类似 sudo apt-g ...
- 网页出现400 Bad Request Request Header Or Cookie Too Large错误的解决方法
在开发项目过程中,突然遇到400 Bad Request Request Header Or Cookie Too Large的报错,我也是第一次出现这样的错误,感觉还是挺新奇的. 分析下出现错误的原 ...
- 关于用wkwebview加载沙盒documents下html文件 模拟器可以,真机不行的解决方案
最近也遇到这个问题,把我解决的思路记录一下 1.问题: 用wkwebview加载(loadRequest)沙盒documents下html文件 模拟器可以,真机不行 (前提是html内部含引用外联样式 ...
- 单片机成长之路(51基础篇) - 013 MCS-51单片机控制详解–T2MOD
T2CON:定时器控制寄存器 寄存器地址0C8H,位寻址0C8H-0CFH. 位地址 CF CE CD CC CB CA C9 C8 位符号 TF2 EXF2 RCLK TCLK EXEN2 TR2 ...
- Unity应用架构设计(9)——构建统一的 Repository
谈到 『Repository』 仓储模式,第一映像就是封装了对数据的访问和持久化.Repository 模式的理念核心是定义了一个规范,即接口『Interface』,在这个规范里面定义了访问以及持久化 ...
- hadoop HA (no zkfc to stop) DFSZKFailoverController进程没有启动
这个bug确实恶心的不要不要的.我一开始以为是我自己打开方式(毕竟不熟悉搭建流程,别人怎么做,我照着做) 我照着视频或者博客编写hdfs-site.xml(dfs.ha.fencing.methods ...
- Linux 用户管理_015
一.用户基础了解 Linux是一个多任务.多用户的操作系统,每个用户和进程都需要对应一个用户和用户组,用户名相当于姓名, 用户UID相当于身份证号,用户组GID相当于公司的工号.用户与用户组的关系一对 ...