今天碰到一个比较有意思的问题, 就是把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. (转)MySql中监视增删改查和查看日志记录

    转载地址为:http://blog.51cto.com/hades02/1641652 首先在命令行输入 show global variables like '%general%' ,然后出现下面的 ...

  2. pt-query-digest 使用说明

    pt-query-digest --user=anemometer --password=123456 --socket=/tmp/mysql.sock --port=43306 --review h ...

  3. Waiting for table metadata lock

    出现下图这个现象之前是在一张事务操作频繁地表上,执行了truncate操作. mysql.sock@(none)> select user,host,db,command,time,state, ...

  4. SecureCRT两步验证自动登录脚本

    简介 用于解决 Google Authenticator 的两步验证登录.涉及到密码,不建议脚本保存到公共环境. 安装oathtool Mac $ brew install oath-toolkit ...

  5. Appium之Android功能脚本

    Android功能脚本 注:这里只写了登录和退出功能,以下不提供app的包名,下面我使用的是线上包 准备:1.Eclipse的Java环境:2.Appium环境:3.Android真机一台. 创建一个 ...

  6. 万里长征第一步:Python进程池的一点点小坑

    # -*- coding: utf- -*- """ Created on Thu Mar :: @author: lilide """ # ...

  7. La nuova tecnologia del puntatore laser

    Il potente puntatore laser 20000 mW viene fornito di serie con gestione termica e driver laser di qu ...

  8. unity shader 常用函数列表

    此篇博客转自csdn的一位大牛. 中间排版出了一些问题 Intrinsic Functions (DirectX HLSL) The following table lists the intrins ...

  9. Dubbo 源码分析 - 集群容错之 LoadBalance

    1.简介 LoadBalance 中文意思为负载均衡,它的职责是将网络请求,或者其他形式的负载"均摊"到不同的机器上.避免集群中部分服务器压力过大,而另一些服务器比较空闲的情况.通 ...

  10. C#通过COM组件操作IE浏览器(二):使用IHTMLDocument3完成登录

    第一章介绍了如何打开网站,这一章介绍一下使用IHTMLDocument3完成登录博客园,以下为代码: SHDocVw.InternetExplorer oBrowser = new SHDocVw.I ...