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

顺序为,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. 用JS做图片轮播

    脚本之家 首页应用手游攻略教程 ﹤首页 >> 网络编程 >> JavaScript >> 网页特效 >> 图象特效 js 图片轮播(5张图片) 作者:m ...

  2. Java 反射机制浅析

    Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反 ...

  3. 简述UITextField的属性和用法

    0.     enablesReturnKeyAutomatically 默认为No,如果设置为Yes,文本框中没有输入任何字符的话,右下角的返回按钮是disabled的. 1.borderStyle ...

  4. 用友U8客户端连接不上服务器全攻略

    用友U8客户端连接不上服务器全攻略 http://www.enet.com.cn2009年09月23日09:26 来自论坛 [导读]:如果网络不通,就让用户查找网络原因 检查步骤: 1.网络是否通? ...

  5. php将unicode编码转为utf-8方法

    介绍 在前端开发中,为了让中文在不同的环境下都能很好的显示,一般是将中文转化为unicode格式,即\u4f60,比如:"你好啊"的 unicode编码为"\u4f60\ ...

  6. Spring发送电子邮件

      Spring提供了发送电子邮件的功能,它向用户屏蔽了底层邮件系统的一些细节,同时代表客户端负责底层的资源处理. Spring的邮件服务支持主要是通过JavaMailSender这个接口实现的: p ...

  7. wamp出现You don’t have permission to access/on this server提示(转)

    转自http://blog.csdn.net/hong0220/article/details/40262729 ,转载方便以后查看. 今天搭建wamp集成环境,本来已经搭建好了,但是在访问local ...

  8. QJ系列笔记

    1.求int型数据在内存中存储时1的个数输入一个int型数据,计算出该int型数据在内存中存储时1的个数. #include<stdio.h> void main() { ; int yu ...

  9. web 之MVC

    MVC 把一个应用的输入.处理.输出流程按照Model, View, Controller 的方式进行分离,这样一个应用被分为三层:模型层.视图层.控制层. 1.View 2.Controller 在 ...

  10. Linux03--文件打包与解压

    参考了<鸟哥的Linux私房菜> 1.压缩命令 gzip(压缩)与zcat(解压并读出来) gzip 可以说是应用度最广的压缩命令了!目前 gzip 可以解开 compress, zip ...