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 ...
随机推荐
- 随机抽样一致性算法(RANSAC)
本文翻译自维基百科,英文原文地址是:http://en.wikipedia.org/wiki/ransac,如果您英语不错,建议您直接查看原文. RANSAC是"RANdom SAmple ...
- .net 生成缩略图
public static void CreateSmallImage(string minImageFullPath, System.Drawing.Image originalImage, int ...
- asp.net mvc 生成条形码
using System; using System.Collections; using System.Collections.Generic; using System.Drawing; usin ...
- A==?B(A,B超级大)
#include <iostream>#include <string.h>#include <cstring>using namespace std;struct ...
- Django模板-基础知识
上一篇中带参数的URLconf虽然可以做到传参动态显示内容,但是最终现实的内容还是硬编码到Python代码中的 def hours_ahead(request,phours): try: phours ...
- PHPStrom上传文件报502错误原因
PhpStorm是一个轻量级且便捷的PHP IDE,其自身拥有apache类似的编译器,能够在无Apache的情况下运行,很适合初学PHPStrom的朋友. 但是我发现了一个问题,那就是用PHPStr ...
- [C语言练习]万年历加强版
/** * @copyright 2011 Chunhui Wang * * wangchunhui@wangchunhui.cn */ #include<stdio.h> int mai ...
- web安全记录
前端 CSRF 跨站请求伪造 客户端添加伪随机数,后台验证 验证码 中间人攻击 SSL证书加密 xss(跨站脚本攻击)漏洞,微软的字符检验(自动) 文本展示编码处理 做标签展示的文本尤其过滤脚本 Co ...
- delphi 读网页线程TReadHtmlThread
读网页,通常是一个耗时操作.故把读网页放入线程是显得比较重要了. 本例用改进后的 TIdhttpEx 加上线程来实现读网页. 它的父类TSimpleThread 在此 本例程源码在此 源码中包含了所有 ...
- 鼠标拖放div 实现
Javascript的mousemove事件类型是一个实时响应的事件,当鼠标指针的位置发生变化时(至少移动1个像素),就会触发mousemove事件.该事件响应的灵敏度主要参考鼠标指针移动速度的快慢, ...