今天碰到一个比较有意思的问题, 就是把A到Y这25个字母以下面的形式输出出来

A B C D E
P Q R S F
O X Y T G
N W V U H
M L K J I
问题很有意思,就是转圈圈把字母填到表格中,要输出这样的格式,其实就需要构造一个下面这样的表格
1 2 3 4 5
16 17 18 18 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

这其实是一个螺旋矩阵的问题, 这跟下面这个问题本质是一样的:

给定一个行数row和列数cols, 输出对应的螺旋数组, 
比如3行5列
1 2 3 4 5
12 13 14 15 6
11 10 9 8 7

又比如5行3列

1 2 3
12 13 4
11 14 5
10 15 6
9 8 7
解决这个问题可能有多种办法, 但是我的思路是按上、右、下、左四个方向不停的往里面画圈,如下图
思路有了,接下来就是写代码的事了,闲话少说,上代码

/**
* 根据传入的行数和列数生成螺旋数组
* @author chenqionghe
* @param int $row 行数
* @param int $col 列数
* @return array
*/
function rotationSort($row=5,$col=5)
{
$k=1;
$result = array();
$small = $col < $row ? $col : $row;
$count = ceil($small / 2);
for($i=0; $i<$count; $i++)
{
$maxRight = $col-1-$i;//右边最大坐标
$maxBottom = $row -1 -$i;//下面最大坐标
for($j=$i; $j<=$maxRight; $j++) //构造上边一条线 纵坐标最小,横坐标递增
{
$result[$i][$j] = $k++;
}
for($j=$i; $j<$maxBottom; $j++) //构造右边一条线 纵坐标递增,横坐标最大
{
$result[$j+1][$maxRight] = $k++;
}
for($j=$maxRight-1;$j>=$i; $j--) //构造下边一条线 纵坐标最大,横坐标递减
{
if($result[$maxBottom][$j]) break;
$result[$maxBottom][$j] = $k++;
}
for($j=$maxBottom-1;$j>$i;$j--) //构造左边一条线 纵坐标递减,横坐标最小
{
if($result[$j][$i]) break;
$result[$j][$i] = $k++;
}
}
return $result;
}
该函数由伟大的诗人chenqionghe撰写, 调用时传数两个参数行数和列数,即可返回螺旋数组,
好人做到底吧,再定义一个以表格输出的方式,打印该螺旋数组直观一点,方法如下

/**
* 以table格式输出数组
* @param $result 螺旋数组
* @param $row 行数
* @param $col 列数
*/
function printArray($result,$row,$col)
{
echo '<table border=1 style="width:500px;">';
for($i=0;$i<$row;$i++)
{
echo '<tr>';
for($j=0;$j<$col;$j++)
{
echo '<td style="padding: 50px;">'.$result[$i][$j].'</td>';
}
echo '<tr>';
}
echo '</table>';
}
然后,我们来调用一下上面的方法,生成一个5*5的螺旋数组
$row = 5;
$col = 5;
$arr = rotationSort($row,$col);
printArray($arr,$row,$col);
执行结果如下
我了个乖乖,只能用perfect来形容。
 
现在,我们回到那个输出25个字母A-Y的问题,解决这个问题更简单了,就是以0-到24为键,A-Y为值,定义数组就行了,如下:
$arr = array('A','B','C','D','E','F', 'G', 'H', 'I', 'J', 'K', 'L', 'N', 'M', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',);
输出的时候稍做改动即能输出A-Y的螺旋数组,完整代码如下
<?php
/**
* 根据传入的行数和列数生成螺旋数组
* @author chenqionghe
* @param int $row 行数
* @param int $col 列数
* @return array
*/
function rotationSort($row=5,$col=5)
{
$k=1;
$result = array();
$small = $col < $row ? $col : $row;
$count = ceil($small / 2);
for($i=0; $i<$count; $i++)
{
$maxRight = $col-1-$i;//右边最大坐标
$maxBottom = $row -1 -$i;//下面最大坐标
for($j=$i; $j<=$maxRight; $j++) //构造上边一条线 纵坐标最小,横坐标递增
{
$result[$i][$j] = $k++;
}
for($j=$i; $j<$maxBottom; $j++) //构造右边一条线 纵坐标递增,横坐标最大
{
$result[$j+1][$maxRight] = $k++;
}
for($j=$maxRight-1;$j>=$i; $j--) //构造下边一条线 纵坐标最大,横坐标递减
{
if($result[$maxBottom][$j]) break;
$result[$maxBottom][$j] = $k++;
}
for($j=$maxBottom-1;$j>$i;$j--) //构造左边一条线 纵坐标递减,横坐标最小
{
if($result[$j][$i]) break;
$result[$j][$i] = $k++;
}
}
return $result;
}
/**
* 以table格式输出数组
* @param $rotationArr 要输出的内容
* @param $result 螺旋数组
* @param $row 行数
* @param $col 列数
*/
function printArray($rotationArr,$result,$row,$col)
{
echo '<table border=1 style="width:500px;">';
for($i=0;$i<$row;$i++)
{
echo '<tr>';
for($j=0;$j<$col;$j++)
{
//echo '<td style="padding: 50px;">'.$result[$i][$j].'</td>';
echo '<td style="padding: 50px;">'.$rotationArr[$result[$i][$j]-1].'</td>';
}
echo '<tr>';
}
echo '</table>';
}
$arr = array('A','B','C','D','E','F', 'G', 'H', 'I', 'J', 'K', 'L', 'N', 'M', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',);
$row = 5;
$col = 5;
$rotationArr = rotationSort($row,$col);
printArray($arr,$rotationArr,$row,$col);
最终输出结果如下:
是不是特别完美,特别想请我吃饭呀!
 

PHP实现螺旋矩阵(螺旋数组)的更多相关文章

  1. 代码随想录第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

    2022/09/22 第二天 第一题 这题我就直接平方后排序了,很无脑但很快乐啊(官方题解是双指针 第二题 滑动窗口的问题,本来我也是直接暴力求解发现在leetCode上超时,看了官方题解,也是第一次 ...

  2. Java-基础编程(螺旋矩阵&乘法表)

    package cn.rick.study; import java.io.BufferedReader;import java.io.InputStreamReader;import java.ut ...

  3. Code Kata:螺旋矩阵 javascript实现

    1 2 3 4  5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9  如图所示,就是一个5*5的螺旋矩阵 我的思路如下: 第一步:拆分 ...

  4. 使用 JS 输出螺旋矩阵

    关于螺旋矩阵 这是我曾经遇到过的面试题,在 LeetCode 上找到了题目的原型,难度中等.题目描述如下: 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中 ...

  5. 螺旋矩阵 java实现(待消化)

    import java.util.Scanner; /** * @author:(LiberHome) * @date:Created in 2019/3/4 17:13 * @description ...

  6. 【模拟】[NOIP2014]螺旋矩阵[c++]

    题目描述 一个n行n列的螺旋矩阵可由如下方法生成: 从矩阵的左上角(第1行第1列)出发,初始时向右移动:如果前方是未曾经过的格子,则继续前进,否则右转:重复上述操作直至经过矩阵中所有格子.根据经过顺序 ...

  7. PAT 1050 螺旋矩阵(25)(代码)

    1050 螺旋矩阵(25)(25 分) 本题要求将给定的N个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上角第1个格子开始,按顺时针螺旋方 ...

  8. PAT B1050 螺旋矩阵 (25 分)

    本题要求将给定的 N 个正整数按非递增的顺序,填入“螺旋矩阵”.所谓“螺旋矩阵”,是指从左上角第 1 个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为 m 行 n 列,满足条件:m×n 等于 N:m ...

  9. C++ 螺旋矩阵算法

    清理磁盘空间的时候翻出了多年前写过的螺旋矩阵,代码效率和水平较低,纪念一下,保存到博客园! // ConsoleApplication3.cpp : 定义控制台应用程序的入口点. // #includ ...

随机推荐

  1. pycharm clion phpstorn全家桶激活码(可以用到2019年4月)

    SXXI7H41YN-eyJsaWNlbnNlSWQiOiJTWFhJN0g0MVlOIiwibGljZW5zZWVOYW1lIjoicGF5bmUgd2FuZyIsImFzc2lnbmVlTmFtZ ...

  2. Notes : <Hands-on ML with Sklearn & TF> Chapter 4

    .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...

  3. 09-JS的事件流的概念(重点)

    在学习jQuery的事件之前,大家必须要对JS的事件有所了解.看下文 事件的概念 HTML中与javascript交互是通过事件驱动来实现的,例如鼠标点击事件.页面的滚动事件onscroll等等,可以 ...

  4. oracle RAC

         RAC安装步骤       1 配置共享存储      2 Grid Infrastructure软件的安装,GI主要用于cluster ,storage的管理      3 安装数据库软件 ...

  5. html基础知识梳理

    1.浏览器内核 补充:blink为Google与Opera共同开发. 2.web标准 web标准为w3c和其他标准化组织制定的一系列标准的集合.(标签闭合.小写.不乱嵌套,使用外链css/js;结构行 ...

  6. VSCode插件开发全攻略(四)命令、菜单、快捷键

    更多文章请戳VSCode插件开发全攻略系列目录导航. 命令 我们在前面HelloWord章节中已经提到了命令写法,这里再重温一下. context.subscriptions.push(vscode. ...

  7. 升讯威微信营销系统开发实践:(1)功能概要与架构设计( 完整开源于 Github)

    GitHub:https://github.com/iccb1013/Sheng.WeixinConstruction因为个人精力时间有限,不会再对现有代码进行更新维护,不过微信接口比较稳定,经测试至 ...

  8. Jenkins关闭和重启实现方式.

    1.关闭Jenkins 只需要在访问jenkins服务器的网址url地址后加上exit.例如我jenkins的地址http://localhost:8080/,那么我只需要在浏览器地址栏上敲下http ...

  9. Senparc.Weixin SDK 微信公众号 .NET 开发教程 索引

    Senparc.WeixinSDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到比较稳定的版本,这个过程中我觉得有必要整理一些思路和经验,和大家一起分享.也欢迎大 ...

  10. 感悟优化——Netty对JDK缓冲区的内存池零拷贝改造

    NIO中缓冲区是数据传输的基础,JDK通过ByteBuffer实现,Netty框架中并未采用JDK原生的ByteBuffer,而是构造了ByteBuf. ByteBuf对ByteBuffer做了大量的 ...