免费注册 查看新帖 |

Chinaunix

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

[算法] 特别难的算法! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-04 18:34 |只看该作者 |倒序浏览
如何实现如下矩阵?
奇数:
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

偶数:
1   2   3   4
12 13 14 5
11 16 15 6
10 9   8   7

论坛徽章:
0
2 [报告]
发表于 2006-04-04 19:51 |只看该作者

回复 1楼 weihuang 的帖子

用Perl给你写了一个,自己改成C罢
$order是矩阵的秩

  1. #!/usr/bin/perl -w

  2. my $order = 7;
  3. my @matrix = [[]];

  4. my $i = 0;
  5. my $j = 0;
  6. my $k = 0;
  7. my $bX = 1;
  8. my $bY = 1;
  9. my $dX = $order;
  10. my $dY = $dX - 1;

  11. sub fillX {
  12.         for (my $n = 0; $n < $dX; $n++) {
  13.                 $matrix[$j][$i] = $k++;
  14.                 $bX ? $i++ : $i--;
  15.         }
  16.         $bX ? $i-- : $i++;

  17.         $bY ? $j++ : $j--;
  18.         $bX = not $bX;
  19.         $dX--;

  20.         $dY > 0 && &fillY;
  21. }

  22. sub fillY {
  23.         for (my $n = 0; $n < $dY; $n++) {
  24.                 $matrix[$j][$i] = $k++;
  25.                 $bY ? $j++ : $j--;
  26.         }
  27.         $bY ? $j-- : $j++;

  28.         $bX ? $i++ : $i--;
  29.         $bY = not $bY;
  30.         $dY--;

  31.         $dX > 0 && &fillX;
  32. }

  33. &fillX;

  34. for ($i = 0; $i < $order; $i++) {
  35.         for ($j = 0; $j < $order; $j++) {
  36.                 printf "%2d ", $matrix[$i][$j];
  37.         }
  38.         print "\n";
  39. }
复制代码

[ 本帖最后由 lonelyflyer 于 2006-4-4 19:55 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2006-04-04 19:57 |只看该作者

回复 2楼 lonelyflyer 的帖子

  1. my @matrix = [[]];
复制代码

这行应该改成罢:
  1. my $matrix = [[]];
复制代码

虽然没有错

论坛徽章:
0
4 [报告]
发表于 2006-04-04 20:01 |只看该作者
void main(){
int rec[10][10];
int n=10;
int i,j,k;
int total=n*n;
int cur=1;
for(i=0;i<=n/2&&cur<total+1;i++){
                for(j=i;j<n-i;j++)  //自左至右填写上面一行
                        rec[i][j]=cur++;
                        j--;
                for(k=i+1;k<n-i;k++)//自上而下填写右面一列
                        rec[k][j]=cur++;
                        k--;
                        j--;
                for(;j>=i;j--)//自右至左填写下面一行
                        rec[k][j]=cur++;
                        j++;
                        k--;
                for(;k>i;k--)//自下而上填写左面一列
                        rec[k][j]=cur++;
}
for(i=0;i<n;i++)
        {for(j=0;j<n;j++)
         printf("%d  ",rec[i][j]);
         printf("\n");
        }
}

论坛徽章:
0
5 [报告]
发表于 2006-04-05 08:23 |只看该作者
不错.......又学到东西了

论坛徽章:
0
6 [报告]
发表于 2006-04-05 09:23 |只看该作者
当年讲完C,期末我们的课程设计就有这道题。当初很快就做出来了,现在全忘了。

论坛徽章:
0
7 [报告]
发表于 2006-04-06 13:23 |只看该作者
这是80年代谭浩强给全国的BASIC爱好者提出的《螺旋方阵》问题。
真亲切啊。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP