PHP实现螺旋矩阵(螺旋数组)
今天碰到一个比较有意思的问题, 就是把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 |
这其实是一个螺旋矩阵的问题, 这跟下面这个问题本质是一样的:
| 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;
}
/**
* 以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>';
}
$row = 5;
$col = 5;
$arr = rotationSort($row,$col);
printArray($arr,$row,$col);

$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',);
<?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实现螺旋矩阵(螺旋数组)的更多相关文章
- 代码随想录第二天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II
2022/09/22 第二天 第一题 这题我就直接平方后排序了,很无脑但很快乐啊(官方题解是双指针 第二题 滑动窗口的问题,本来我也是直接暴力求解发现在leetCode上超时,看了官方题解,也是第一次 ...
- Java-基础编程(螺旋矩阵&乘法表)
package cn.rick.study; import java.io.BufferedReader;import java.io.InputStreamReader;import java.ut ...
- 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的螺旋矩阵 我的思路如下: 第一步:拆分 ...
- 使用 JS 输出螺旋矩阵
关于螺旋矩阵 这是我曾经遇到过的面试题,在 LeetCode 上找到了题目的原型,难度中等.题目描述如下: 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中 ...
- 螺旋矩阵 java实现(待消化)
import java.util.Scanner; /** * @author:(LiberHome) * @date:Created in 2019/3/4 17:13 * @description ...
- 【模拟】[NOIP2014]螺旋矩阵[c++]
题目描述 一个n行n列的螺旋矩阵可由如下方法生成: 从矩阵的左上角(第1行第1列)出发,初始时向右移动:如果前方是未曾经过的格子,则继续前进,否则右转:重复上述操作直至经过矩阵中所有格子.根据经过顺序 ...
- PAT 1050 螺旋矩阵(25)(代码)
1050 螺旋矩阵(25)(25 分) 本题要求将给定的N个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上角第1个格子开始,按顺时针螺旋方 ...
- PAT B1050 螺旋矩阵 (25 分)
本题要求将给定的 N 个正整数按非递增的顺序,填入“螺旋矩阵”.所谓“螺旋矩阵”,是指从左上角第 1 个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为 m 行 n 列,满足条件:m×n 等于 N:m ...
- C++ 螺旋矩阵算法
清理磁盘空间的时候翻出了多年前写过的螺旋矩阵,代码效率和水平较低,纪念一下,保存到博客园! // ConsoleApplication3.cpp : 定义控制台应用程序的入口点. // #includ ...
随机推荐
- pychrom 中文版
http://jingyan.baidu.com/article/a378c960daf80eb328283033.html
- 关于Idea里设置Terminal为Git/bin/bash.exe中文乱码的问题的终极解决方案
1.这里如果设置为Git/git-bash.exe确实不会乱码,但是每次点Idea里的Terminal都会弹出一个单独的terminal窗口而非在idea子窗口里出现: 2.因此需要设置为Git/bi ...
- spring扩展点总结
NamespaceHandler 通过自定义的NamespaceHandler,配合BeanDefinitionParser,可以完成自定义Bean的组装操作,对于BeanDefinition的数据结 ...
- 基于模型的特征选择详解 (Embedded & Wrapper)
目录 基于模型的特征选择详解 (Embedded & Wrapper) 1. 线性模型和正则化(Embedded方式) 2. 基于树模型的特征选择(Embedded方式) 3. 顶层特征选择算 ...
- azure cosmos db (mongo DB)
使用.net mongo的操作类操作azure(微软云)cosmosdb时,发现在做delete的操作的时候可以传一个文档对象,但是最后这个文档会解析成具体的sql语句,而当文档特别大时这样就出先了转 ...
- 【ProtoBuffer】windows上安装ProtoBuffer3.1.0 (附已编译资源)
------- 17.9.17更新 --- 以下这些方法都是扯淡,对我的机器不适用,我后来花了最后成功安装并亲测可用的方法不是靠vs编过的,vs生成的库引入后函数全部报undefine refere ...
- eclipse设置新建jsp文件默认字符编码为utf-8
在使用Eclipse开发中,编码默认是ISO-8859-1,不支持中文.这样我们每次新建文件都要手动修改编码,非常麻烦.其实我们可以设置文件默认编码,今后再新建文件时就不用修改编码了. 1.打开Ecl ...
- 管道/FIFO
管道: #include<stdio.h> #include<unistd.h> #include<stdlib.h> #include<string.h&g ...
- C#算法与数据结构之线性结构
线性结构是什么? 线性结构是一种数据结构,它有一对一的关系,就像一个长对,一个接一个,特点是,除第一个元素和最后一个元素外,其它元素前后只有一个元素. 简单示例1: static void Main( ...
- git常用的命令行
git管理相关基础命令行,因为现在很多公司都用git管理代码,所以被问及的概率很大,可以用pycharm的git系统,也可以用git代码管理 $git init #初始化仓库$git branch 分 ...