算法导论:打印回旋数;

  问题:打印输出逆时针螺旋矩阵,要求螺旋矩阵的阶数由用户输入。例如 n=4时,输出的螺旋矩阵如下:

  

  下面给出我的代码:  

 1 package org.warnier.zhang.exercises;
 2
 3 public class Convolution {
 4     private int n;
 5     private int[][] array;
 6     private int number = 1;
 7
 8     public Convolution(int n) {
 9         this.n = n;
10         array = new int[n][n];
11         init();
12     }
13
14     private void init() {
15         for (int i = 0; i < n; i++) {
16             for (int j = 0; j < n; j++) {
17                 array[i][j] = 0;
18             }
19         }
20     }
21
22     //逆时针方向回旋;
23     public void generateConvolutionNumber() {
24         //处理迭代“内圈”数字输出;
25         int a = 0;
26         int b = n -1 - a;
27         while (b >= a) {
28             //与正常的数组输出方向一致螺旋输出;
29             for (int i = a; i <= b; i++) {
30                 for (int j = a; j <= b; j++) {
31                     if (i != b && j == a) {
32                         array[i][j] = number++;
33                     }
34                     if (i == b && j != b) {
35                         array[i][j] = number++;
36                     }
37                 }
38             }
39
40             //与正常的数组输出方向相反螺旋输出;
41             for (int i = b; i >= a; i--) {
42                 for (int j = b; j >= a; j--) {
43                     if (i != a && j == b) {
44                         array[i][j] = number++;
45                     }
46                     if (i == a && j != a) {
47                         array[i][j] = number++;
48                     }
49                 }
50             }
51
52             a ++;
53             b = n -1 - a;
54         }
55
56         //打个补丁:没能解决n为奇数的情况!(没有加上这句代码,中间的空格输出默认值0!)
57         if(n % 2 != 0){
58             array[n/2][n/2] = number;
59         }
60     }
61
62     public void vprintf() {
63         for (int i = 0; i < n; i++) {
64             for (int j = 0; j < n; j++) {
65                 System.out.printf("%3d", array[i][j]);
66             }
67             System.out.println();
68         }
69     }
70
71 }

  简要说明,a 和 b 的存在,是为了解决螺旋输出内圈的数字;下面的是测试代码:

 1 package org.warnier.zhang.exercises;
 2
 3 public class ConvolutionTest {
 4
 5     public static void main(String[] args) {
 6         Convolution convolution = new Convolution(5);
 7         convolution.generateConvolutionNumber();
 8         convolution.vprintf();
 9     }
10
11 }
12
13 结果:
14   1 16 15 14 13
15   2 17 24 23 12
16   3 18 25 22 11
17   4 19 20 21 10
18   5 6  7  8  9

  这是我的解决方法,主要是将回旋划分为从上到下,从左到右,从下到上,从右到左的四个方向分别处理,要注意后两个方向与正常的数组输出方向相反。这道算法题对学生党来说有点压力,但是掌握了能够写出好多好玩的东西,比如贪吃蛇。上面的算法只是一种可能的实现,欢迎读者贴上自己的代码,交流交流!

时间: 2024-10-24 12:13:39

算法导论:打印回旋数;的相关文章

《算法导论》思考题15-2 整齐打印

画外音:没想做到15-2题也是费了一番周折,看来<算法导论>里题都不是白给的 整齐打印问题: 考虑在一个打印机上整齐地打印一段文章的问题.输入的正文是n个长度分别为L1.L2.…….Ln(以字符个数度量)的单词构成的序列.我们希望将这个段落在一些行上整齐地打印出来,每行至多M个字符.“整齐度”的标准如下:如果某一行包含从i到j的单词(i<j),且单词之间只留一个空格,则在行末多余的空格字符个数为 M - (j-i) - (Li+ …… + Lj),它必须是非负值才能让该行容纳这些单词.我

print neatly 整齐打印 算法导论

作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4098562.html 题目链接:print neatly 整齐打印 算法导论 考虑在一个打印机上整齐地打印一段文章的问题.输入的正文是$n$个长度分别为$L_1,L_2,\dots ,L_n$(以字符个数度量)的单词构成的序列.我们希望将这个段落在一些行上整齐地打印出来,每行至多$M$个字符.“整齐度”的标准如下:如果某一行包含从i到j的单词$(i<j)$,且单词之间只留一个空格,则在行末

算法导论第十二章__二叉搜索数

package I第12章__二叉搜索树; //普通二叉树 public class BinaryTree<T> { // -----------------------数据结构--------------------------------- private int height = 0; private Node<T> rootNode; class Node<T> { T t; int key; Node left; Node right; public Node

算法导论:快速找出无序数组中第k小的数

题目描述: 给定一个无序整数数组,返回这个数组中第k小的数. 解析: 最平常的思路是将数组排序,最快的排序是快排,然后返回已排序数组的第k个数,算法时间复杂度为O(nlogn),空间复杂度为O(1).使用快排的思想,但是每次只对patition之后的数组的一半递归,这样可以将时间复杂度将为O(n). 在<算法导论>有详细叙述 这里主要用C++实现,实现思路就是先选取当前数组的第一个数作为"主轴",将后面所有数字分成两部分,前面一部分小于"主轴",后面一部

【算法导论】用动态规划解活动选择问题

上一篇讲了贪心算法来解活动选择问题([算法导论]贪心算法之活动选择问题),发现后面有一道练习16.1-1是要用动态规划来解活动选择问题.其实跟之前的矩阵链乘法有些相似,也是考虑分割的活动是哪一个,并用二维数据来记录Sij---最大兼容集合个数,和用另一个二维数据来记录Sij取得最大时的活动分割点k.然后就是考虑边界问题,和使用递归来求动态规划的最优解. 代码注解比较详尽: #include <iostream> #include <algorithm> using namespac

《算法导论》读书笔记之第16章 0-1背包问题—动态规划求解

原文:http://www.cnblogs.com/Anker/archive/2013/05/04/3059070.html 1.前言 前段时间忙着搞毕业论文,看书效率不高,导致博客一个多月没有更新了.前段时间真是有些堕落啊,混日子的感觉,很少不爽.今天开始继续看算法导论.今天继续学习动态规划和贪心算法.首先简单的介绍一下动态规划与贪心算法的各自特点及其区别.然后针对0-1背包问题进行讨论.最后给出一个简单的测试例子,联系动态规划实现0-1背包问题. 2.动态规划与贪心算法 关于动态规划的总结

算法导论_第十六章_动态规划_creatshare分享会

动态规划 注:该篇为本人原创,转载请注明出处:http://blog.csdn.net/chudongfang2015/article/details/51590817--开心 -.- 个人对动态规划的理解: 1.动态规划是一个付出额外空间来节省时间,就是所谓的空间换时间. 2.动态规划储存每个状态的最优解. 3.动态规划是用来把子问题的结果储存下来,再次用到的时候就不必再进行重复计算. 算法导论对动态规划的解释: 动态规划和分治方法相似,都是通过组合子问题的解来求解原问题,分治方法将问题划分为

算法导论------------------动态规划之矩阵链问题

[问题描述] 给定有n个连乘矩阵的维数,要求计算其采用最优计算次序时所用的乘法次数,即所要求计算的乘法次数最少.例如,给定三个连乘矩阵{A1,A2,A3}的维数分别是10*100,100*5和5*50,采用(A1A2)A3,乘法次数为10*100*5+10*5*50=7500次,而采用A1(A2A3),乘法次数为100*5*50+10*100*50=75000次乘法,显然,最好的次序是(A1A2)A3,乘法次数为7500次. 分析: 矩阵链乘法问题描述: 给定由n个矩阵构成的序列[A1,A2,.

概率分析和随机算法&mdash;&mdash;算法导论(5)

1. 雇用问题 (1) 提出问题     你的老板让你为公司雇用一名程序员,现在有n个人投了简历.你每天会随机的从这n份简历中挑选一份,然后让对应的投简历者过来面试,每次面试都将花费C1.而你的雇用原则是:如果当前面试的程序员比目前的程序员优秀,那么你就辞掉目前的程序员,而花高价C2去聘请面试的这位程序员.你的老板愿意为该策略付费,但是想让你估算一下该费用会是多少. 下面是这种策略的伪代码:               (2) 不科学的算法     因为不管最优秀的面试者出现在哪一个位置,我们总