题目链接:https://www.nowcoder.com/acm/contest/114/A

代码:

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int A[105],cnt;
void span(int x)
{cnt = 1;A[cnt++] = 0;if(x == 1) return ;if(x == 2){A[cnt++] = 3;return ;}int sum = 0,cn = 1;while(1){if(x - cn == 1){sum = sum + 3;A[cnt++] = sum;break;}if(x - cn == 0){break;}sum = sum + (x-cn)*4;A[cnt++] = sum;cn = cn + 2;}return ;
}
void path(int po,int cha,int n)
{int l=1+po-1;int r=n-po+1;int x=po,y=po;int op=1;while(cha){if(op==1){if(x+1==r) op++;x++;}else if(op==2){if(y+1==r) op++;y++;}else if(op==3){if(x-1==l) op++;x--;}else{y--;}cha--;}printf("%d %d\n",x,y);
}
int main()
{int n,m;while(scanf("%d %d",&n,&m)!=EOF){memset(A,0,sizeof(A));span(n);int l,r,cha,vis=0;for(int i=1;i<cnt;i++) //m
        {if(m == A[i]) {vis=i;break;}if(m>A[i]) l=i;if(m<A[i]) {r=i;break;}}cha=m-A[l];if(vis!=0){printf("%d %d\n",vis,vis);}else path(l,cha,n);}return 0;
}

分析:

这道题目不用数组做,只要善于发现一些小规律就好了,做出这道题目最大的原因就是冷静分析,拆分题目!

题目拆分主要为3部分:

1.如图一,对于给出的每一个边长,我们用数组储存每一圈对应可以走多少步。需要注意的是,偶数边与奇数的边对应的圈数不同。

2.对于第二个参数m,我们定位到它位于数组的哪一个范围之间,然后在对应的那一圈里面寻找就好了。(特殊:要考虑到m的步数值刚好落在每一层开始的点)

3,也是最重要的一步,就是根据所在的圈数,算出差值还差多少步,初始化x,y坐标为层数刚开始的点的坐标,遍历到这一层对应差值的点,这里遍历一圈无非是4种不同的

坐标记录方法,可以用op代表正在执行的操作种类,最后x,y对应的值就是解。

总结:这道题应该是大比赛上的签到题,它属于那种要心细还要冷静分析才能解决的题目,涉及到题目的分析,这一点非常的关键!!不要一上来就是二维数组的环形遍历,要找规律,找突破点,拆分题目!!最后,请带着你最初的梦想继续前进吧!

2018,6,9,1:35

---------------------------------------------------------分割线---------------------------------------------------------

也许是我们都把问题想的太过于复杂了,但是根本的原因还是接触的题型不够多。比赛完了之后,看了一下段诩大佬的代码,简短有力,思路明确,这就是区别,见贤思齐,以后多多参悟段诩的代码,提高自身水平。#include <bits/stdc++.h> //知识点1using namespace std;


typedef long long ll;const int kMax = 1010;const int dx[] = {1, 0, -1, 0};    //这是整道他解题的关键,利用方向数组来实现朝着指定方向遍历,也就是所谓的环形遍历
const int dy[] = {0, -1, 0, 1};int n, m;
bool vis[kMax][kMax];               //这个数组就是记录下有没有被遍历过void solve(int x, int y) {int d = 0;memset(vis, false, sizeof(vis));vis[x][y] = true;while (m--) {for (int i = 0; i < 4; ++i) {d = (d + i) % 4;         //这里要对4取余,是因为4次之后,d=4的方向与d=0一样,所以取余int tx = x + dx[d], ty = y + dy[d];if (tx >= 0 && tx < n && ty >= 0 && ty < n && !vis[tx][ty]) {    //这个选择条件亦是很重要,遍历的时候,保证坐标不能越界,不能重复遍历x = tx;y = ty;break;           //这里添加break,是因为坐标满足了一个方向遍历的条件,break出去之后,还是朝着原来的方向继续走。}                                                    //当坐标遇到需要拐弯时,进不来这个if,那么d就会根据i来改变方向。        }         vis[x][y] = true;     }     printf("%d %d\n", x + 1, y + 1); }int main(){     scanf("%d%d", &n, &m);    solve(0, 0);     return 0;}

这道题目需要学到的:

1.d方向值+break巧妙使用,以前都是直接for四个方向,然后就直接根据i来选择方向了,但是在这道题目中,d才是真正决定走哪个方向的值,还有当我满足那个if选择条件的时候,我就break掉了,那么不管d的值如何,那么下一次进来的时候,d还是保持原来的值,那么我的方向就不会改变,除非你不在能够满足我的if条件,那么我才会改变d的下一个方向的值。

2.对4取余,是因为d=0与d=4的走的方向一样,所以对4取余,保证了当d=4的时候,重新开始计数d

3.#include<bits/stdc++.h> 这个头文件几乎包含了C++所有的头文件库,相当于引入了所有的标准函式库!!以后就不用再打长长的一串头文件了。

转载于:https://www.cnblogs.com/myxdashuaige/p/9158184.html

牛课网--走格子(环形遍历数组并且找出指定步数的位置)相关推荐

  1. python查找数列中重复数字_在数组中找出重复的数字(异或法)

    购买本课程后,可以加51CTO学院李宁老师官方交流群:550369460注意,该群只允许购买李宁老师课程的学员进行技术交流,加群时需要提供在51CTO购买李宁老师课程的订单编号(任何一个课程的订单编号 ...

  2. 从一个数组中找出 N 个数,其和为 M 的所有可能--最 nice 的解法

    比起讨论已经存在的大牛,我们更希望有更多有潜力的前端小伙伴成为大牛,只有这样,前端在未来才能够持续不断的发光发热. 故事的背景 这是一个呆萌炫酷吊炸天的前端算法题,曾经乃至现在也是叱咤风云在各个面试场 ...

  3. 改进,从一个数组中找出 N 个数,其和为 M 的所有可能

    特此说明,本文算法改自于<从一个数组中找出 N 个数,其和为 M 的所有可能--最 nice 的解法>一文.本文不同的是,采用二进制正序表示法,这种实现思路更直观.更简单些. 问题 从一个 ...

  4. c++如何输入数组_从一个数组中找出 N 个数,其和为 M 的所有可能最 nice 的解法...

    编者按:本文由前端狂想录公众号授权奇舞周刊转载. 故事的背景 这是一个呆萌炫酷吊炸天的前端算法题,曾经乃至现在也是叱咤风云在各个面试场景中. 可以这样说,有 90% 以上的前端工程师不会做这个题目. ...

  5. 数据结构与算法--有序数组中找出和为s的两个数字

    有序数组中找和为s的两个数字 题目:输入一个递增排序的数组array, 和一个数字s, 在数组中找出两个数,使得这两个数的和是s,如果有多对,输出一对即可. 最简单方案 双循环,每次获取一个数据,和数 ...

  6. 编写一个程序,从10亿个数字的数组中找出100个最大的数字

    本文翻译自:Write a program to find 100 largest numbers out of an array of 1 billion numbers I recently at ...

  7. 输入 10 个学生 3 门课的成绩,用函数实现:找出最高的分数所对应的学号和成绩

    输入 10 个学生 3 门课的成绩,用函数实现:找出最高的分数所对应的学号和成绩 本题用到结构体数组的使用,数组中含10个元素分别代表10个学生,每个元素包含学号num 和成绩score[3] (三门 ...

  8. 给定一个整数数组 nums和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标。

    问: /** 给定一个整数数组 nums和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数 ...

  9. 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标

    题目链接:https://leetcode-cn.com/problems/two-sum/solution/liang-shu-zhi-he-by-leetcode-2/ 给定一个整数数组 nums ...

最新文章

  1. sklearn API 文档 - 0.18 中文翻译
  2. python【Matlibplot绘图库】曲线样式的两种设置方式(看不懂你来打我)
  3. 怎么看rabbitmq的浏览器信息_没用过消息队列?一文带你体验RabbitMQ收发消息
  4. Python学习三——列表
  5. python3编译器怎么下载_Python编译器及Sublime Text3安装及开发环境配置
  6. 解决IE6下 position的fixed定位问题
  7. 图神经网络(一)图信号处理与图卷积神经网络(5)图卷积神经网络
  8. C++应用过程中使用知识点
  9. saveOrUpdate的使用
  10. Unicode – CSS中文字体转编码
  11. Windows10与Vmware配置Windowsserver2003共享磁盘
  12. iview admin 使用爬坑
  13. 如何下载历史版本和最新版本的iar
  14. qq服务器只保留7天文件吗,qq离线文件服务器上的离线文件能保留几天(一般7天)?...
  15. 海淘thinkpad-t460p攻略
  16. php面试自我介绍结束语,面试自我介绍 结尾 社团招新面试自我介绍
  17. ffmpeg利用滤镜合并两个视频,一左一右
  18. 常用代码模板3——搜索与图论(Bellman-Ford算法 、spfa 算法、floyd算法、Kruskal算法、染色法、匈牙利算法 )
  19. 节点法分析求电压电流
  20. 【人工智能】大脑传:人类对大脑的认识与历史

热门文章

  1. 百度地图经常崩溃的问题
  2. 一个监控磁盘的nagios脚本
  3. Android数据库专家秘籍(七)经验LitePal查询艺术
  4. android图片压缩总结
  5. 基于HT for Web 3D呈现Box2DJS物理引擎
  6. 软件需求分析--三步走
  7. Spring学习手册番外:context:annotation-config/ 和 mvc:annotation-driven / 的区别
  8. CentOS 7系统安装配置图文详解
  9. jsp窗口关闭的触发函数
  10. C#数据导出Excel详细介绍