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

顺序为,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)其他以此类推。

题目是打印出来顺序的坐标。

当场这道题我没写出来,后来面试官让我回家写,然后发到他的邮箱。回到家网上找了一下,也没有好的解决方案,只好自己写了。

总体思路采用一个大循环控制,循环条件当前的最大纵坐标不小于最小纵坐标,并且当前小横坐标不小于最大横坐标时,循环终止,然后再按照上右下左的顺序分四个小循环遍历。

     第一步:实现等高等宽的矩阵(x=y)的坐标遍历。
     第二步:采用记录标志的方式改进,实现x!=y或x=y矩阵的遍历。
 
第一步代码实现:
 /**
* [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笔试算法题:顺时针打印矩阵坐标-蛇形算法的更多相关文章

  1. 牛客网剑指offer第19题——顺时针打印矩阵

    这个题看似很简单: 题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 ...

  2. 剑指 Offer 29. 顺时针打印矩阵 + 蛇形矩阵 + 模拟 + 思维题

    剑指 Offer 29. 顺时针打印矩阵 Offer_29 题目描述: 题解分析: 题目的初衷是将这道题当做一个简单题处理 这道题一开始想的太复杂了,其实可以参考迷宫广度优先搜索的过程,只不过在选定一 ...

  3. [PHP] 算法-顺时针打印矩阵的PHP实现

    1.行数和列数取出来row,col,圈数就是 (较小值-1)/2+1 2.外层循环控制圈数,内层四个for循环,i 3.第一个for循环,从左到右,j=i;j<col-i;j++;j<; ...

  4. 《剑指offer》第二十九题(顺时针打印矩阵)

    // 面试题29:顺时针打印矩阵 // 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. #include <iostream> void PrintMatrixInC ...

  5. 【剑指offer】顺时针打印矩阵

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/26053049 剑指offer上的第20题,九度OJ上測试通过. 题目描写叙述: 输入一个矩 ...

  6. 剑指Offer(十九):顺时针打印矩阵

    剑指Offer(十九):顺时针打印矩阵 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baid ...

  7. 剑指offer---1、顺时针打印矩阵

    剑指offer---1.顺时针打印矩阵 一.总结 一句话总结: 谋而后动+多做:还是要谋而后动,但是怎么谋而后动,很有学问,做好的方式就是多做 问题就这些问题:解决了就好了,比如php多维数组 面试的 ...

  8. 《剑指offer》— JavaScript(19)顺时针打印矩阵

    顺时针打印矩阵 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打 ...

  9. 《剑指offer》顺时针打印矩阵

    本题来自<剑指offer> 顺时针打印矩阵 题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 1 ...

随机推荐

  1. C# for循环①护栏长度 ②广场砖面积 ③判断闰年平年

        // static void Main(string[] args)         { const double PI = 3.14;             const int BAR_U ...

  2. MYSQL设置字段数据过长自动截断

    自动截断如下设置: windows: 修改my.ini: [mysqld] sql-mode="STRICT_TRANS_TABLES" linux: 修改/ect/mysql/m ...

  3. perl 一个简单的面向对象的例子

    <pre name="code" class="python">[root@wx03 wx]# cat x1.pm package x1; use ...

  4. 如何用ATL创建ActiveX控件

    演示截图: 代码简介或代码解析: 如何用ATL创建ActiveX控件 实现了一个ActiveX控件,它在一个圆内部有个正多边形,当用户在多变形内部单击将会使多边形的边数在当前的基础上+1,在多变形外部 ...

  5. POJ 3662 Telephone Lines(二分答案+SPFA)

    [题目链接] http://poj.org/problem?id=3662 [题目大意] 给出点,给出两点之间连线的长度,有k次免费连线, 要求从起点连到终点,所用的费用为免费连线外的最长的长度. 求 ...

  6. Sass 的基本语法规则

    转自:http://www.cnblogs.com/qqloving/p/3676852.html 自从发现可编程的css语法 Sass和基于Sass的css库compass 一个给我的感觉像c# 另 ...

  7. C++STL_类模板举例

    #include<stdio.h> #include<typeinfo.h> template <class T1,class T2> class A{ T1 i; ...

  8. [Leetcode][Python]40: Combination Sum II

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 40: Combination Sum IIhttps://oj.leetco ...

  9. Qt部件--烧肉

    1,QSplitter

  10. 「花田对」CSDN程序员专场——谁来拯救技术宅!_豆瓣

    「花田对」CSDN程序员专场--谁来拯救技术宅!_豆瓣 「花田对」CSDN程序员专场--谁来拯救技术宅!