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 ...
随机推荐
- JQuery 拖动层
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- javaweb一周总结(菜鸟)
我的试用期开始了. 这是我的第一篇博客,这也是我作为java工程师的第六天,主要是为了记录一周内出现的问题以及一些工作上的解答,吐槽一句工作的确和想的不一样之后直接记录下吧. 由于拥有工作平台看不到底 ...
- eclipse 使用maven 创建springmvc + mybatis
接着eclipse 使用maven 创建纯spring mvc项目 毕竟项目都要访问数据库的, 所以加上mybatis的支持也就是网上大多时候说的 SSM框架的搭建(Spring + Spring M ...
- Android Studio 实时显示布局文件Preview窗口
Android Studio的功能包含preview窗口, 可以查看布局(layout)的样式; 位置:app->src->main->res(资源)->layout(布局), ...
- web2py官方文档翻译01
第一章:介绍 介绍 web2py(web2py)是一个免费的开源web框架的敏捷开发安全的数据库驱动的web应用程序,这是用Python编写的Python(Python)和可编程.web2py是一个完 ...
- Linux07--Shell程序设计03 通配符与正则表达式
通配符 通配符可用于代替字符. 通常地,星号“*”匹配0个或以上的字符,问号“?”匹配1个字符. 使用情况: 1.文件和目录 在CP/M.DOS.Microsoft Windows和类Unix操作系统 ...
- Delphi检测网络连接状态
有时候,我们做一些小软件就需要检测网络连接状态,比如想给你的软件加上类似QQ那样的系统消息,可是像我这样的穷人肯定是买不起服务器了,那我们只好另想办法,可以读取网页然后用浏览器显示,这个时候就需要判断 ...
- ASP.NET自定义控件加载资源WebResource问题
最近项目用日期控件,想把My97的资源文件跟TextBox封装成一个DatePicker控件,其实很简单的意见事情,但是还是用了一天多的时间,主要的问题就是解决资源文件加载的问题.通过一天多的努力,得 ...
- vs2008 + OpenCV-2.1.0-win32-vs2008安装
vs2008 + OpenCV-2.1.0-win32-vs2008安装 1. 安装vs2008+sp12. 安装opencv-2.1.0-win32-vs2008,假设安装目录为c:/opencv2 ...
- web本地存储-UserData
userData,IE中持久化用户数据的方法. 使用userData用户数据首先必须使用css指定userData行为.代码示例: var ud = document.createElement(&q ...