免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2093 | 回复: 4
打印 上一主题 下一主题

讨论一个算法 通过传入的n,输出一个n*n的矩阵 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-28 18:59 |只看该作者 |倒序浏览
要求:通过传入的n,输出一个n*n的矩阵, 顺序如下所示.

n=4
/*
1   2   3  4
12 13 14 5
11 16 15 6
10  9  8  7
*/


void func(int n)


讨论一下,在php下有什么效率比较好的算法。

论坛徽章:
0
2 [报告]
发表于 2007-06-29 02:54 |只看该作者
看来大家平时在部署php应用的时候很少用到一些算法解决问题。也难怪,php多是用来处理表现层的,再加上内置的函数很多。下面是我自己写的,感觉效率不是很好,本来是先想看看别人是怎样来解决的。



  1. <?php
  2. $n = 9;
  3. function sortmm($n)
  4. {
  5.         $mark = 0;
  6.         $y=1;
  7.         $a=array();
  8.         $d = 1;
  9.         $ss = 1;
  10.         $ll = 1;
  11.         for($i=0;$i<$n;){
  12.                 $x = $n-$i;
  13.                 for($j=0;$j<$x;$j++){
  14.                         switch ($d) {
  15.                                 case 1:
  16.                                         $a[$ss][$ll++]=$y;
  17.                                         $oo=$ss;
  18.                                         $pp=$ll;
  19.                                         if($j == $x-1){
  20.                                                 $ll = $ss = $ss+1;
  21.                                                  $pp = $pp-1;
  22.                                         }
  23.                                     break;
  24.                                 case 2:
  25.                                         $oo = $oo +1;
  26.                                         $a[$oo][$pp]=$y;
  27.                                     break;
  28.                                 case 3:
  29.                                            $a[$oo][--$pp]=$y;
  30.                                     break;
  31.                                 case 4:
  32.                                         $a[--$oo][$pp]=$y;
  33.                                     break;
  34.                         }
  35.                         $y++;
  36.                 }
  37.                 if($d  == 4){
  38.                         $d = 0;
  39.                 }
  40.                 $d++;
  41.                 if($mark==2){
  42.                         $mark = 0;
  43.                         $i++;
  44.                 } elseif($n==$n-$i){
  45.                         $i++;
  46.                 }
  47.                 $mark++;
  48.         }
  49.         return $a;
  50. }
  51. $a = sortmm($n);
  52. for($sb=1;$sb<=$n;$sb++){
  53.         for($bs=1;$bs<=$n;$bs++){
  54.                 echo $a[$sb][$bs].' ';
  55.         }
  56.         echo '<br />';
  57. }
  58. ?>
复制代码

论坛徽章:
0
3 [报告]
发表于 2007-06-29 17:05 |只看该作者
螺旋(陀螺)矩阵啊,好说:


  1. <?php

  2.     $m=4;
  3.     print "<pre>";
  4.     for ($x=0;$x<$m;$x++)
  5.         for (printf("\n"),$y=0;$y<$m;$y++)
  6.         {
  7.             $l=min(min($x,$m-$x-1),min($y,$m-$y-1));
  8.             $c=4*$l*($m-$l);
  9.             $c+=$y<$x?4*$m-$x-$y-6*$l-3:$x+$y-2*$l+1;
  10.             printf("%4d",$c);
  11.         }
  12.     print "</pre>";
  13. ?>
复制代码


从c里面抄来的,php就是好,连抄算法都这么简单,啦啦啦~~~

论坛徽章:
0
4 [报告]
发表于 2007-06-30 02:33 |只看该作者
原帖由 sunnyfun 于 2007-6-29 17:05 发表
螺旋(陀螺)矩阵啊,好说:

[code]
<?php

    $m=4;
    print "<pre>";
    for ($x=0;$x<$m;$x++)
        for (printf("\n"),$y=0;$y<$m;$y++)
        {
   ...

代码确实简练,11行。
测试了一下,运行时间却慢了些,可能是里面用到min吧。完了把min替换了试试。

论坛徽章:
0
5 [报告]
发表于 2007-06-30 10:49 |只看该作者
如果是min的关系的话,那是由于两者min的实现方法不同吧。
因为原来在c中min是使用三元算子实现的:

  1. #define min(x,y) ((x)<(y)?(x):(y))
复制代码


你在php替换一下再试试。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP