热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python/PHP数字螺旋矩阵的程序代码-PHP源码

矩阵不管在php或python中它只是一种算法了,我们要做的就是利用我们所学的程序来实现这种算法即可达到我们的需求了,下面来看它们的实现方法。
矩阵不管在php或python中它只是一种算法了,我们要做的就是利用我们所学的程序来实现这种算法即可达到我们的需求了,下面来看它们的实现方法。

什么是螺旋矩阵?

螺旋矩阵是指一个呈螺旋状的矩阵,它的数字由第一行开始到右边不断变大,向下变大,向左变大,向上变大,如此循环。下图就是一个螺旋矩阵的示例:


郑晓在这里分别使用了Python和PHP来实现了数字的螺旋矩阵。其中的PHP版本写成了函数,更加灵活的对矩阵进行控制。写Python时由于是第一次写,有些生疏,分别用了两种方法来实现。。。下面上代码吧:

Python螺旋矩阵的第一版(比较难以理解?!):
#coding:gbk
L = 6 #矩阵大小
result = [[0]*L for n in range(L)]
row =0   #初始行   从左上角开始
col = 0  #初始列   从左上角开始
value = 1#初始值
direction = 'r' #初始方向 向右
circle = 1 #初始圈数 第一圈
while True:
        #向右走
        if direction == 'r':
                result[row][col] = value
                if col>=L-circle:
                        direction = 'd'
                        continue
                col += 1
        #向下走
        if direction =='d':
                result[row][col] = value
                if row >= L-circle:
                        direction = 'l'
                        continue
                row += 1
        #向左走
        if direction == 'l':
                result[row][col] = value
                if col <= circle -1:
                        direction = &#39;u&#39;
                        continue
                col -= 1
        #向上走
        if direction == &#39;u&#39;:
                result[row][col] = value
                if row-1 <= circle:
                        direction = &#39;r&#39;
                        circle += 1
                        #continue
                row -= 1
        value += 1
        if value > L * L :
                break
for R in result:
        for c in R:
                print "%3d" % (c) ,
        print
raw_input()


接下来是Python螺旋矩阵的第二版,其中使用了迭代器控制方向,代码量明显减少,而且更容易理解了。多次使用不同的起点生成的矩阵时,你会发现有个地方写的有点儿“问题”,找到问题了没有?

#coding:gbk
import itertools
#参数:矩阵宽(w)、高(h)、起始横坐标、起始纵坐标
def print_matrix(w, h, x = 0, y = 0):
    #方向移动时的操作
    op = [(1,0), (-1,0), (0,-1), (0,1)]
    #迭代器可无限迭代列表 每次要换方向时就next()
    direction = itertools.cycle(op)
    #根据行列生成所有坐标
    result = {(xx,yy):None for xx in range(w) for yy in range(h)}
    result[(x,y)] = 1
    _x, _y = direction.next()
    i = 1
    flag = 0 
    while True:
            new_x = x + _x
            new_y = y + _y
            if (new_x, new_y) in result and result[(new_x, new_y)] is None:
                i = i + 1
                result[(new_x, new_y)] = i
                x = new_x
                y = new_y
                flag = 0
            else:
                _x, _y = direction.next()
                flag = flag + 1
            if flag>4: break
    #打印结果
    for y in range(h):
        for x in range(w):
            print "%3d" % (result[(x,y)]),
        print
#调用示例
print_matrix(6,6,5,0)
raw_input()


下面是PHP版的螺旋矩阵,思路和上面的Python是一样的(其实我是照着写的…)。

/* *
 * @param $w : 宽
 * @param $h : 高
 * @param $s : 起始数字
 * @param $x, $y : 起始位置坐标 只能从四顶点开始
 * @param $r :方向 默认顺时间 false为逆时针
 * @author : 郑晓
 * php5.6.11
 * 这是一个螺旋矩阵的PHP版本,由于之前在python下写过,有了一些经验,所以在php中也使用了SPL的一个迭代器,用于换向。算法编写时是使用的过程式,后来又改为了函数,加入了一些自定义参数,方便调用(然并卵)。输出中使用的是制表和换行符,请在浏览器源代码中查看运行结果。
 */
function print_matrix($w, $h, $s=1, $l=1, $x=0, $y=0, $r=true) {
    $R = array(array(1,0), array(0,1), array(-1,0), array(0,-1));
    !$r && $R = array_reverse($R);
    $iterator = new InfiniteIterator(new ArrayIterator($R)); //创建一个无限迭代器
    $iterator->rewind(); //指针指向第一元素
    list($_x, $_y) = $iterator->current();
    $result = [];
    $result[$x][$y] = $s;
    for($i = $s+1; $i <$s+$w * $h; $i++) {
        $new_x = $x + $_x;
        $new_y = $y + $_y;
        
        if(0<= $new_x && 0<= $new_y && $new_x <$w && $new_y <$h && !isset($result[$new_x][$new_y])) {
            $result[$new_x][$new_y] = $i;
            $x = $new_x;
            $y = $new_y;
        } else {
            $iterator->next();
            list($_x, $_y) = $iterator->current();
            $i--;
        }
    }
    //以下是打印矩阵结构
    for($i=0; $i<$h; $i++) {
        for($j=0; $j<$w; $j++) {
            echo $result[$j][$i], "\t";
        }
        echo "\n";
    }
}
//调用示例测试
print_matrix(5, 5); echo "\n";
print_matrix(7, 4); echo "\n";
print_matrix(5, 5, 1, 4, 0); echo "\n";
print_matrix(5, 5, 10, 0, 4, false); echo "\n";


下面是依次的运行结果:

python螺旋矩阵

python螺旋矩阵

php螺旋矩阵

推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • Python如何调用类里面的方法
    本文介绍了在Python中调用同一个类中的方法需要加上self参数,并且规范写法要求每个函数的第一个参数都为self。同时还介绍了如何调用另一个类中的方法。详细内容请阅读剩余部分。 ... [详细]
  • 本文介绍了游戏开发中的人工智能技术,包括定性行为和非定性行为的分类。定性行为是指特定且可预测的行为,而非定性行为则具有一定程度的不确定性。其中,追逐算法是定性行为的具体实例。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 近年来,大数据成为互联网世界的新宠儿,被列入阿里巴巴、谷歌等公司的战略规划中,也在政府报告中频繁提及。据《大数据人才报告》显示,目前全国大数据人才仅46万,未来3-5年将出现高达150万的人才缺口。根据领英报告,数据剖析人才供应指数最低,且跳槽速度最快。中国商业结合会数据剖析专业委员会统计显示,未来中国基础性数据剖析人才缺口将高达1400万。目前BAT企业中,60%以上的招聘职位都是针对大数据人才的。 ... [详细]
author-avatar
平凡小迪
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有