codewars贪吃蛇算法题目
有这样一个题目:
Given an n x n
array, return the array elements arranged from outermost elements to the middle element, traveling clockwise.
array = [[1,2,3],
[4,5,6],
[7,8,9]]
snail(array) #=> [1,2,3,6,9,8,7,4,5]
For better understanding, please follow the numbers of the next array consecutively:
array = [[1,2,3],
[8,9,4],
[7,6,5]]
snail(array) #=> [1,2,3,4,5,6,7,8,9]
This image will illustrate things more clearly:
NOTE: The idea is not sort the elements from the lowest value to the highest; the idea is to traverse the 2-d array in a clockwise snailshell pattern.
NOTE 2: The 0x0 (empty matrix) is represented as [[]]
题目意思是,给出一个N*N的二维数组,要求输出一个顺时针的一维数组,0*0的和1*1的直接原样一维数组返回就行了。
下面是我的解法:
snail = function (array) {
// enjoy
let len = array.length;
console.log(len);
if (array.length == 1) {
return array[0];
} else {
let i = 0, j = len - 1;
let rowStart = 1, rowEnd = len - 1, colStart = 0, colEnd = len - 2;
let direction = 'down';
for (let index = 0; index < len * (len - 1); index++) {
console.log(direction, 'direction');
switch (direction) {
case 'down':
i++;
if (i >= rowEnd) {
i = rowEnd;
rowEnd--;
console.log('down', i, rowEnd);
direction = 'left';
}
break;
case 'left':
j--;
if (j <= colStart) {
j = colStart;
colStart++;
console.log('left');
direction = 'up';
}
break;
case 'up':
i--;
if (i <= rowStart) {
i = rowStart;
rowStart++;
console.log('up');
direction = 'right';
}
break;
case 'right':
j++;
if (j >= colEnd) {
j = colEnd;
colEnd--;
console.log('right');
direction = 'down';
}
break;
}
console.log(array[i][j], i, j);
array[0].push(array[i][j]);
} }
return array[0];
}
虽然感觉啰嗦,但是勉强实现了。
下面看看得分最高的选手的代码:
snail = function (array) {
var result;
while (array.length) {
result = (result ? result.concat(array.shift()) : array.shift());
for (var i = 0; i < array.length; i++) {
result.push(array[i].pop());
}
row.result = result.concat((array.pop() || []).reverse());
for (var i = array.length - 1; i >= 0; i--) {
result.push(array[i].shift());
}
}
return result;
}
代码简单,清晰明了,充分调用了数组的各种方法,pop、shift、reverse等。
还有更简单的写法,原理大同小异,可能广大网友没怎么往下看或者觉得上面选手的代码更容易读懂的原因吧,得分不高,但是代码更是简练到了极致,欣赏一下代码的艺术吧。
const snail = function (array) {
const list = [];
while (array.length) {
list.push(...array.shift(), ...array.map(row => row.pop()));
array.reverse().map(row => row.reverse());
}
return list;
}
that's all, thanks!
codewars贪吃蛇算法题目的更多相关文章
- 小项目特供 贪吃蛇游戏(基于C语言)
C语言写贪吃蛇本来是打算去年暑假写的,结果因为ACM集训给耽搁了,因此借寒假的两天功夫写了这个贪吃蛇小项目,顺带把C语言重温了一次. 是发表博客的前一天开始写的,一共写了三个版本,第一天写了第一版,第 ...
- 浅析初等贪吃蛇AI算法
作为小学期程序设计训练大作业的一部分,也是自己之前思考过的一个问题,终于利用小学期完成了贪吃蛇AI的一次尝试,下作一总结. 背景介绍: 首先,我针对贪吃蛇AI这一关键词在百度和google上尽心了检索 ...
- AI贪吃蛇前瞻——基于Dijkstra算法的最短路径问题
在贪吃蛇流程结构优化之后,我又不满足于亲自操刀控制这条蠢蠢的蛇,干脆就让它升级成AI,我来看程序自己玩,哈哈. 一.Dijkstra算法原理 作为一种广为人知的单源最短路径算法,Dijkstra用于求 ...
- [LeetCode] Design Snake Game 设计贪吃蛇游戏
Design a Snake game that is played on a device with screen size = width x height. Play the game onli ...
- AI贪吃蛇(二)
前言 之前写过一篇关于贪吃蛇AI的博客,当时虽然取得了一些成果,但是也存在许多问题,所以最近又花了三天时间重新思考了一下.以下是之前博客存在的一些问题: 策略不对,只要存在找不到尾巴的情况就可能失败, ...
- 贪吃蛇的java代码分析(一)
自我审视 最近自己学习java已经有了一个多月的时间,从一开始对变量常量的概念一无所知,到现在能勉强写几个小程序玩玩,已经有了长足的进步.今天没有去学习,学校里要进行毕业答辩和拍毕业照了,于是请了几天 ...
- 以小时候玩的贪吃蛇为例,对于Java图像界面的学习感悟
简介 正文 01.JFrame是啥? 02.JPanel 03. KeyListener 04.Runnable 05.游戏Running 06.游戏初始类编写 07.main 简介: 一直以来用代码 ...
- 【BZOJ-4213】贪吃蛇 有上下界的费用流
4213: 贪吃蛇 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 58 Solved: 24[Submit][Status][Discuss] Desc ...
- Android实现贪吃蛇游戏
[绥江一百]http://www.sj100.net 欢迎,进入绥江一百感谢点击[我的小网站,请大家多 ...
随机推荐
- C++虚函数相关内容
样例代码 class Base{public: Base(){}; virtual ~Base(){ //若没有设置为虚函数:如果有这样的指针Base *p=new Derived();声明,则 ...
- C、C++、boost、Qt在嵌入式系统开发中的使用
概述 嵌入式系统开发相对来说属于偏底层的开发,也就是与硬件结合比较紧密,只能使用C/C++语言.对于做平台开发的人来说,C语言真的是很"古老"的语言,属于操作系统语言!好多人会觉得 ...
- nginx多个server的配置,同一端口
nginx多个server的配置,同一端口 #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/e ...
- Linux查询版本、查询端口
lsb_release -a 查看当前Linux系统版本 netstat 检查端口 netstat 是一个命令行工具,可以提供有关网络连接的信息.要列出正在侦听的所有 TCP 或 UDP 端口,包括使 ...
- C#LeetCode刷题之#55-跳跃游戏(Jump Game)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3674 访问. 给定一个非负整数数组,你最初位于数组的第一个位置. ...
- C#LeetCode刷题之#232-用栈实现队列(Implement Queue using Stacks)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4108 访问. 使用栈实现队列的下列操作: push(x) -- ...
- C#开发笔记之04-如何用C#优雅的计算个人所得税?
C#开发笔记概述 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/960 访问. 首先,要对个人所得税的计算方式了解之后再 ...
- geth建立私链以及发布第一个智能合约
原博客地址 https://blog.csdn.net/qq_36124194/article/details/83686740 geth建立私链 初始化genesis.json文件 geth --d ...
- JDK8 String类知识总结
一.概述 java的String类可以说是日常实用的最多的类,但是大多数时候都只是简单的拼接或者调用API,今天决定深入点了解一下String类. 要第一时间了解一个类,没有什么比官方的javaDoc ...
- for循环的插入元素
Scanner input = new Scanner(System.in); int[] num = new int[5]; for (int i = 0; i < num.length; ...