• 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)其他以此类推。

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

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

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

         第一步:实现等高等宽的矩阵(x=y)的坐标遍历。
         第二步:采用记录标志的方式改进,实现x!=y或x=y矩阵的遍历。
     
    第一步代码实现:
      1 /**
      2  * [printXY 顺时针遍历等高等宽矩阵坐标]
      3  * @param  integer $n [矩阵宽高]
      4  * @return string     [坐标字符串]
      5  */
      6 function printXY($n=1) 
      7 {
      8     if($n<=1) return '(0,0)';
      9 
     10     $minTopX    = 0;    //当前最小横坐标
     11     $maxRightY  = $n-1; //当前最大纵坐标
     12     $maxBottomX = $n-1; //当前最大横坐标
     13     $minLeftY   = 0;    //当前最小纵坐标
     14 
     15     $sortXY = ''; //定义一个空字符串,用于接收坐标
     16 
     17     //当当前的最大纵坐标不小于最小纵坐标,并且当前小横坐标不小于最大横坐标时,循环终止
     18     while ($minLeftY <= $maxRightY && $minTopX <= $maxBottomX) {
     19         //循环的顺序为,上->右->下->左
     20         // 当前上面一行
     21         for($j = $minLeftY; $j <= $maxRightY; $j++) {
     22             $sortXY .= '('.$minTopX.','.$j.') ';
     23         }
     24         $minTopX++;
     25 
     26         // 当前右边一行
     27         for($i = $minTopX; $i <= $maxBottomX; $i++) {
     28             $sortXY .= '('.$i.','.$maxRightY.') ';
     29         }
     30         $maxRightY--;
     31 
     32         // 当前底部一行
     33         for($j = $maxRightY; $j >= $minLeftY; $j--) {
     34             $sortXY .=  '('.$maxBottomX.','.$j.') ';
     35         }
     36         $maxBottomX--;
     37 
     38         // 当前左边一行
     39         for($i = $maxBottomX; $i >= $minTopX; $i--) {
     40             $sortXY .= '('.$i.','.$minLeftY.') ';
     41         }
     42         $minLeftY++;
     43     }
     44     return $sortXY;
     45 }

    第二步的实现代码:

     1 /**
     2  * [printXY2 顺时针遍历矩阵坐标]
     3  * @param  integer $x [矩阵宽度]
     4  * @param  integer $y [矩阵高度]
     5  * @return string     [坐标字符串]
     6  */
     7 function printXY2($x=1,$y=1) 
     8 {
     9     if($x<=1 && $y<=1) return '(0,0)';
    10 
    11     $minTopX    = 0;    //最小横坐标
    12     $maxRightY  = $y-1; //最大纵坐标
    13     $maxBottomX = $x-1; //最大横坐标
    14     $minLeftY   = 0;    //最小纵坐标
    15 
    16     $sortXY = ''; //定义一个空字符串,用于接收坐标
    17     $sortXYFlagArr[0][0] = false; //定义一个二维数组,记录是否被使用过。
    18 
    19     //当当前的最大纵坐标不小于最小纵坐标,并且当前小横坐标不小于最大横坐标时,循环终止
    20     while ($minLeftY <= $maxRightY && $minTopX <= $maxBottomX) {
    21         //循环的顺序为,上->右->下->左
    22 
    23         // 当前上面一行
    24         for($j = $minLeftY; $j <= $maxRightY; $j++) {
    25             if(!isset($sortXYFlagArr[$minTopX][$j])){
    26                 $sortXY .= '('.$minTopX.','.$j.') ';
    27                 $sortXYFlagArr[$minTopX][$j] = true;
    28             }
    29         }
    30         $minTopX++;
    31 
    32         // 当前右边一行
    33         for($i = $minTopX; $i <= $maxBottomX; $i++) {
    34             if(!isset($sortXYFlagArr[$i][$maxRightY])){
    35                 $sortXY .= '('.$i.','.$maxRightY.') ';
    36                 $sortXYFlagArr[$i][$maxRightY] = true;
    37             }
    38         }
    39         $maxRightY--;
    40 
    41         // 当前底部一行
    42         for($j = $maxRightY; $j >= $minLeftY; $j--) {
    43             if(!isset($sortXYFlagArr[$maxBottomX][$j])){
    44                 $sortXY .=  '('.$maxBottomX.','.$j.') ';
    45                 $sortXYFlagArr[$maxBottomX][$j] = true;
    46             }
    47         }
    48         $maxBottomX--;
    49 
    50         // 当前左边一行
    51         for($i = $maxBottomX; $i >= $minTopX; $i--) {
    52 
    53             if(!isset($sortXYFlagArr[$i][$minLeftY])){
    54                 $sortXY .= '('.$i.','.$minLeftY.') ';
    55                 $sortXYFlagArr[$i][$minLeftY] = true;
    56             }
    57         }
    58         $minLeftY++;
    59     }
    60     return $sortXY;
    61 }

    请大家指正。

    码代码不易,码文字更不易,转载请注明出处,多谢! 不仅仅是记录,也是分享
  • 相关阅读:
    Java页面中文编码要转换两次encodeURI
    ajax用get刷新页面元素在IE下无效解决~~
    祝贺自己开博~~
    错误域控降级导致解析问题
    ELK 脚本自动化删除索引
    Windows针对子目录共享权限控制
    ES查询区分大小写
    Docker异常时区问题
    Docker自定义镜像无容器日志输出
    ELK时间戳
  • 原文地址:https://www.cnblogs.com/haodaquan/p/4976145.html
Copyright © 2020-2023  润新知