回形遍历( calc .cpp/c/pas)

时间限制:1s
内存 限制: 256MB

【问题 描 述】

给出一个 n*m 的棋盘,按如下方式遍历,请问(x,y)往后 z 步走到的是哪个格子。

【输入】

输入文件名为 calc.in。
一行,包含五个整数:n,m,x,y,z

【输出】

输出文件名为 calc.out。
输出一行,包含两个整数,表示所在格子的横纵坐标

【输入输出样例】

  calc .in     calc .out  
4 5 3 0 5 2 4

【 样例解释 】

【数据说明】

对于 70%的数据,1<=n,m,z<=1000,0<=x<n,0<=y<m
对于 100%的数据,1<=n,m,z<=100000,0<=x<n,0<=y<m

思路:

  1)70%的思路:

      (使用数组存储的)模拟/搜索

      ①模拟的话,就弄一个fx记录正在往什么方向走,然后用jz数组记录下来走过的路程,然后特判一下如果走到了(x,y)位置,只需要在继续模拟z步,然后最后输出走到了哪里即可

      ②搜索的思路其实跟模拟是一样的。。。

  2)100%的思路:

    因为空间开100000*100000会炸掉,所以上面的模拟/搜索思路已经不能够适用了,所以我们应该想出一种不开数组存数的办法

    思路如下:(以下所说的i==横坐标,y==纵坐标)

      首先你需要拥有一个n*m的矩阵,然后找寻一下规律,如下图:

      首先考虑,如果我们一个一个的来跳的话,跳到最后一定会超时,所以就一排(列)的跳,如图

    假设已经跳到了(x,y)所在的行:(之前如何跳就是用当前的i或者是j是否比x或者是y在同一排或者是列,如果不在,就继续成排成列的跳)

    然后跟给出的(x,y)中的j进行比较(因为这一排的i都是跟x相同的,只有j不同)。

    如果j>y了,那么就说明多走了几步,题目中又需要求从(x,y)往后走z步到达的点的坐标,所以用当前的点的j减去y就是当前点多走的步数(记住我们是一走走一排)。

    

      如果减出来的数比z大(j-y>z)就说明多走了,所以直接在当前的基础(i,j)上往回走j-y-z步即可,即在(x,y)基础上往右直接走z步如图:

      如果减出来的数比z小(j-y<z),那么就说明还需要继续走。但是需要在当前的基础(i,j)上走多少步呢?

        其实就是用z-(j-y)得出还需要往下走z-j+y步,所以就转入往下的操作,如图:

      (往下左上的操作自己手动模拟就好啦~这里就不给出了。。)

坑点:

  第一种的时候数组千万别开大了啊啊啊啊!原来空间辣么小(256MB),炸掉了qwq

  我safufu的开了100000*100000的数组2333

  ps:计算空间是用100000*100000*4/(1024*2)约是38200MB>256MB

上代码:

1)70分无脑模拟(嘻嘻,至于搜索嘛~自己意会意会咯!)

#include<cstdio>
#include<iostream>
using namespace std; const int Maxx=;
int jz[Maxx][Maxx];
int n,m,x,y,z; int main() {
freopen("calc.in","r",stdin);
freopen("calc.out","w",stdout);
scanf("%d%d%d%d%d",&n,&m,&x,&y,&z);
x++,y++;
int js=,i=,j=,fx=,Maxn=n*m;
while(js<Maxn) {
if(!jz[i][j])
jz[i][j]=++js;
if(i==x && j==y)
Maxn=js+z;
if(fx==) {
j++;
if(j>m || jz[i][j]!=) fx=,j--;
} else if(fx==) {
i++;
if(i>n || jz[i][j]!=) fx=,i--;
} else if(fx==) {
j--;
if(j< || jz[i][j]!=) fx=,j++;
} else if(fx==) {
i--;
if(i< || jz[i][j]!=) fx=,i++;
}
}
printf("%d %d",i,j);
return ;
}

2)正解模拟w

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; int main() {
freopen("calc.in","r",stdin);
freopen("calc.out","w",stdout);
int m,n,x,y,z;
scanf("%d%d%d%d%d",&m,&n,&y,&x,&z);
int penx=,peny=,step=;
int i=n-,j=m-,flag=;
bool right=true,up=false;
bool first=true;
int cnt=;
while(!(step==n*m-)) {
if(flag) {
step+=j;
if(right) {
peny+=j;
if(penx==x && peny>=y) {
cnt+=peny-y;
y=peny;
if(cnt>=z) {
printf("%d %d",y-cnt+z,x);
// fclose(stdin);fclose(stdout);
return ;
}
}
} else {
peny-=j;
if(penx==x && peny<=y) {
cnt+=y-peny;
y=peny;
if(cnt>=z) {
printf("%d %d",y+cnt-z,x);
// fclose(stdin);fclose(stdout);
return ;
}
}
}
if(!first) j--;
else first=false;
right=!right;
} else {
step+=i;
if(up) {
penx-=i;
if(peny==y && penx<=x) {
cnt+=x-penx;
x=penx;
if(cnt>=z) {
printf("%d %d",y,x+cnt-z);
// fclose(stdin);fclose(stdout);
return ;
}
}
} else {
penx+=i;
if(peny==y && penx>=x) {
cnt+=penx-x;
x=penx;
if(cnt>=z) {
printf("%d %d",y,x-cnt+z);
// fclose(stdin);fclose(stdout);
return ;
}
}
}
i--;
up=!up;
}
flag^=;
}
printf("%d %d",peny,penx);
// fclose(stdin);fclose(stdout);
return ;
}

2017.9.23 NOIP2017 金秋杯系列模拟赛 day1 T1的更多相关文章

  1. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  2. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

  3. 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...

  4. 【强联通分量缩点】【最长路】【spfa】CH Round #59 - OrzCC杯NOIP模拟赛day1 队爷的讲学计划

    10分算法:对于城市网络为一条单向链的数据, 20分算法:对于n<=20的数据,暴力搜出所有的可能路径. 结合以上可以得到30分. 60分算法:分析题意可得使者会带着去的城市也就是这个城市所在强 ...

  5. 【离散化】【扫描线】CH Round #59 - OrzCC杯NOIP模拟赛day1 队爷的新书

    //上图绿色扫描线右侧少画了一条扫描线. 很多区间把数轴分成了很多段,看哪个点的(区间覆盖数*该点权值)最大. 显然在某个区间的右端点的答案是最优的. 排序后 用扫描线从左到右扫描,维护每个点的覆盖数 ...

  6. CH Round #59 - OrzCC杯NOIP模拟赛day1

    第一题:队爷的新书 题意简述:给定n个闭区间,求出一个数p使它与包含它的区间数的积最大,输出这个积. 分析:使用一个差分数组g,每个区间[l,r],l位置加1,r+1的位置减1,从前往后统计,得到对于 ...

  7. 模拟赛DAY1 T1大美江湖

    这就是一个模拟题,注意1234分别对应左右上下横坐标和纵坐标的判断就好了 题解: 需要注意的是,向上取整ceil函数是对于一个double值返回一个double值,也就是说在ceil里面的类型一定要是 ...

  8. 洛谷noip 模拟赛 day1 T1

    T7925 剪纸 题目描述 小芳有一张nnn*mmm的长方形纸片.每次小芳将会从这个纸片里面剪去一个最大的正方形纸片,直到全部剪完(剩下一个正方形)为止. 小芳总共能得到多少片正方形纸片? 输入输出格 ...

  9. Java 第十一届 蓝桥杯 省模拟赛 小明的城堡

    小明用积木搭了一个城堡. 为了方便,小明在搭的时候用的是一样大小的正方体积本,搭在了一个 n 行 m 列的方格图上,每个积木正好占据方格图的一个小方格. 当然,小明的城堡并不是平面的,而是立体的.小明 ...

随机推荐

  1. numpy数组常用计算

    在说numpy库数组的计算之前先来看一下numpy数组形状的知识: 创建一个数组之后,可以用shape来查看其形状,返回一个元组 例如:a = np.array([[1, 2, 3], [4, 5, ...

  2. 使用python django快速搭建微信公众号后台

    前言 使用python语言,django web框架,以及wechatpy,快速完成微信公众号后台服务的简易搭建,做记录于此. wechatpy是一个python的微信公众平台sdk,封装了被动消息和 ...

  3. 关于RESTful API

    添几篇文章: 一.What Is REST? 二.RESTful API最佳实践 三.MS Azure——API Design 这些文章里面也推荐了一些关联文章,微软那篇最详细,非常值得一读.

  4. js文字跑马灯

    实现文字跑马灯效果,主要控制scrollLeft. 效果图如下 代码如下 <html> <head> <script type="text/javascript ...

  5. 怎样理解xhr.overrideMimeType()和xhr.responseType

    一般情况下, 我们会通过 xhr.responseType 告诉服务器我们想要什么类型的返回数据. 然后xhr.response 会根据xhr.responseType属性值来自动解析返回值. 但有时 ...

  6. hdu 1572 全排列的搜索

    好久没写搜索的题目了 复习一下/./ 这道题目是暴力的全排列#include<cstdio> #include<iostream> #include<cstring> ...

  7. 【QT 学习笔记】 一、 VS2015+ QT环境安装

    1.   安装    qt-opensource-windows-x86-msvc2015_64-5.6.0.exe   (根据自己的VS版本来安装) 下载地址 http://download.qt. ...

  8. Java学习路径(抛光砖)

    这就是我刚刚在五孔问答中找到的Java学习路线图抛光砖价格.我个人认为,这条Java学习路线是可以的.它是2018年相对较新的Java学习路线,更符合企业就业标准. Java学习路径的第一阶段:Jav ...

  9. 主流RPC框架详解,以及与SOA、REST的区别

    什么是RPC RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. 简言之,RPC使 ...

  10. 10.SpringMVC注解式开发-处理器方法的参数

    1.逐个参数接收 只要保证请求参数名与该请求处理方法的参数名相同即可 // 请求参数名 与该处理器中的请求方法的参数名相同 ,即可接收前台传递过来的参数 public ModelAndView met ...