php笔试算法题:顺时针打印矩阵坐标-蛇形算法
这几天参加面试,本来笔试比较简单,但是在面试的时候,技术面试官说让我现场写一个算法,顺时针打印矩阵的坐标,如图所示

顺序为,0,1,2,3,4,9,14,19,24,23,22,21,20,15,10,5,6,7,8,13,18,17,16,11,12
假设 0的坐标为(0,0),1的坐标为(0,1),5的坐标为(1,0)其他以此类推。
题目是打印出来顺序的坐标。
当场这道题我没写出来,后来面试官让我回家写,然后发到他的邮箱。回到家网上找了一下,也没有好的解决方案,只好自己写了。
总体思路采用一个大循环控制,循环条件当前的最大纵坐标不小于最小纵坐标,并且当前小横坐标不小于最大横坐标时,循环终止,然后再按照上右下左的顺序分四个小循环遍历。
/**
* [printXY 顺时针遍历等高等宽矩阵坐标]
* @param integer $n [矩阵宽高]
* @return string [坐标字符串]
*/
function printXY($n=1)
{
if($n<=1) return '(0,0)'; $minTopX = 0; //当前最小横坐标
$maxRightY = $n-1; //当前最大纵坐标
$maxBottomX = $n-1; //当前最大横坐标
$minLeftY = 0; //当前最小纵坐标 $sortXY = ''; //定义一个空字符串,用于接收坐标 //当当前的最大纵坐标不小于最小纵坐标,并且当前小横坐标不小于最大横坐标时,循环终止
while ($minLeftY <= $maxRightY && $minTopX <= $maxBottomX) {
//循环的顺序为,上->右->下->左
// 当前上面一行
for($j = $minLeftY; $j <= $maxRightY; $j++) {
$sortXY .= '('.$minTopX.','.$j.') ';
}
$minTopX++; // 当前右边一行
for($i = $minTopX; $i <= $maxBottomX; $i++) {
$sortXY .= '('.$i.','.$maxRightY.') ';
}
$maxRightY--; // 当前底部一行
for($j = $maxRightY; $j >= $minLeftY; $j--) {
$sortXY .= '('.$maxBottomX.','.$j.') ';
}
$maxBottomX--; // 当前左边一行
for($i = $maxBottomX; $i >= $minTopX; $i--) {
$sortXY .= '('.$i.','.$minLeftY.') ';
}
$minLeftY++;
}
return $sortXY;
}
第二步的实现代码:
/**
* [printXY2 顺时针遍历矩阵坐标]
* @param integer $x [矩阵宽度]
* @param integer $y [矩阵高度]
* @return string [坐标字符串]
*/
function printXY2($x=1,$y=1)
{
if($x<=1 && $y<=1) return '(0,0)'; $minTopX = 0; //最小横坐标
$maxRightY = $y-1; //最大纵坐标
$maxBottomX = $x-1; //最大横坐标
$minLeftY = 0; //最小纵坐标 $sortXY = ''; //定义一个空字符串,用于接收坐标
$sortXYFlagArr[0][0] = false; //定义一个二维数组,记录是否被使用过。 //当当前的最大纵坐标不小于最小纵坐标,并且当前小横坐标不小于最大横坐标时,循环终止
while ($minLeftY <= $maxRightY && $minTopX <= $maxBottomX) {
//循环的顺序为,上->右->下->左 // 当前上面一行
for($j = $minLeftY; $j <= $maxRightY; $j++) {
if(!isset($sortXYFlagArr[$minTopX][$j])){
$sortXY .= '('.$minTopX.','.$j.') ';
$sortXYFlagArr[$minTopX][$j] = true;
}
}
$minTopX++; // 当前右边一行
for($i = $minTopX; $i <= $maxBottomX; $i++) {
if(!isset($sortXYFlagArr[$i][$maxRightY])){
$sortXY .= '('.$i.','.$maxRightY.') ';
$sortXYFlagArr[$i][$maxRightY] = true;
}
}
$maxRightY--; // 当前底部一行
for($j = $maxRightY; $j >= $minLeftY; $j--) {
if(!isset($sortXYFlagArr[$maxBottomX][$j])){
$sortXY .= '('.$maxBottomX.','.$j.') ';
$sortXYFlagArr[$maxBottomX][$j] = true;
}
}
$maxBottomX--; // 当前左边一行
for($i = $maxBottomX; $i >= $minTopX; $i--) { if(!isset($sortXYFlagArr[$i][$minLeftY])){
$sortXY .= '('.$i.','.$minLeftY.') ';
$sortXYFlagArr[$i][$minLeftY] = true;
}
}
$minLeftY++;
}
return $sortXY;
}
请大家指正。
php笔试算法题:顺时针打印矩阵坐标-蛇形算法的更多相关文章
- 牛客网剑指offer第19题——顺时针打印矩阵
这个题看似很简单: 题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 ...
- 剑指 Offer 29. 顺时针打印矩阵 + 蛇形矩阵 + 模拟 + 思维题
剑指 Offer 29. 顺时针打印矩阵 Offer_29 题目描述: 题解分析: 题目的初衷是将这道题当做一个简单题处理 这道题一开始想的太复杂了,其实可以参考迷宫广度优先搜索的过程,只不过在选定一 ...
- [PHP] 算法-顺时针打印矩阵的PHP实现
1.行数和列数取出来row,col,圈数就是 (较小值-1)/2+1 2.外层循环控制圈数,内层四个for循环,i 3.第一个for循环,从左到右,j=i;j<col-i;j++;j<; ...
- 《剑指offer》第二十九题(顺时针打印矩阵)
// 面试题29:顺时针打印矩阵 // 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. #include <iostream> void PrintMatrixInC ...
- 【剑指offer】顺时针打印矩阵
转载请注明出处:http://blog.csdn.net/ns_code/article/details/26053049 剑指offer上的第20题,九度OJ上測试通过. 题目描写叙述: 输入一个矩 ...
- 剑指Offer(十九):顺时针打印矩阵
剑指Offer(十九):顺时针打印矩阵 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baid ...
- 剑指offer---1、顺时针打印矩阵
剑指offer---1.顺时针打印矩阵 一.总结 一句话总结: 谋而后动+多做:还是要谋而后动,但是怎么谋而后动,很有学问,做好的方式就是多做 问题就这些问题:解决了就好了,比如php多维数组 面试的 ...
- 《剑指offer》— JavaScript(19)顺时针打印矩阵
顺时针打印矩阵 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打 ...
- 《剑指offer》顺时针打印矩阵
本题来自<剑指offer> 顺时针打印矩阵 题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 1 ...
随机推荐
- UVa 821 Page Hopping
题意: 给出一个有向图,求所有路径(两点间的最短路径)的平均值. 分析: 用floyd求两点间的最短距离,然后求平均就好. 代码: #include <iostream>#include ...
- Android面试必备
好吧,说实话是自己面试被问到的和自己整理的别人的一些问题,很多问题的回答可能根据水平不同层次和深度不同,如果经常忘的话可能是还没明白原理,学习就是对对抗遗忘,现在开始复习吧: 每个面试的问题都极大的贴 ...
- RANSAC算法详解
给定两个点p1与p2的坐标,确定这两点所构成的直线,要求对于输入的任意点p3,都可以判断它是否在该直线上.初中解析几何知识告诉我们,判断一个点在直线上,只需其与直线上任意两点点斜率都相同即可.实际操作 ...
- Tomcat启动报ClassNotFoundException错误,解决
今天把一个Maven管理的web项目Update后,启动Tomcat(Eclipse中)系统报错.错误提示 java.lang.ClassNotFoundException: ,显示是spring的C ...
- TCP/IP详解之:UDP协议
第11章 UDP协议 UDP首部 UDP的检验和是可选的,而TCP的检验和是必须的: UDP的检验和是端到端的检验和.由发送端计算,由接收端验证: 尽管UDP的检验和是可选的,但总是推荐被使用 IP ...
- dpkg, APT, aptitude常用命令
Install dpkg --install, -i [deb] apt-get install [package] aptitude install [package] Remove dpkg -- ...
- python正则表达式基础篇
1.正则表达式基础 1.1简单介绍 正则表达式并不是Python的一部分.正则表达式是用于处理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如str自带的方法,但功能十分强大 ...
- zmud中文版_汉化补丁_汉化文件ZMUD破解
ZMUD721中文版 http://pan.baidu.com/s/1mixwIoC
- React 从0开始 消息传递
React笔记 React 数据决定DOM 以往的做法是通过JS去操作DOM 将数据填充 JSX Jsx javascript xml HTML的结构组装到js中 jsx使用style的时候 不能直接 ...
- JavaScript学习之—prototype
一.利用prototype扩展String方法,去除字符前后空格: String.prototype.trim = function String$trim() { if (arguments.len ...