看到博客园上有人发这个程序的练习,便自己也写了一个。

代码

 1 class ScremNumbers
 2 {
 3     enum Direction { Right, Down, Left, Up }
 4 
 5     [System.Diagnostics.DebuggerDisplay("({X},{Y})")]
 6     struct Point
 7     {
 8         public int X;
 9         public int Y;
10     }
11 
12     public int Count { get; private set; }
13 
14     int[,] numbers;
15     public ScremNumbers(int count)
16     {
17         this.Count = count;
18         numbers = new int[count, count];
19 
20         Process();
21     }
22 
23     void Process()
24     {
25         var point = new Point();
26         var direction = Direction.Right;
27 
28         for (int i = 0; i < Count * Count; i++)
29         {
30             var nextPoint = NextPoint(point, direction);
31             if (this[nextPoint] != 0)
32             {
33                 direction = NextDirection(direction);
34                 nextPoint = NextPoint(point, direction);
35             }
36 
37             this[point] = i + 1;
38             point = nextPoint;
39         }
40     }
41 
42     public void Print()
43     {
44         var maxLength = (Count * Count).ToString().Length + 1;
45 
46         for (int i = 0; i < Count; i++)
47         {
48             for (int j = 0; j < Count; j++)
49             {
50                 Console.Write(numbers[j, i].ToString().PadRight(4));
51             }
52             Console.WriteLine();
53         }
54     }
55 
56     Point NextPoint(Point point, Direction direction)
57     {
58         var nextPoint = point;
59         switch (direction)
60         {
61             case Direction.Right:
62                 nextPoint.X++;
63                 break;
64             case Direction.Down:
65                 nextPoint.Y++;
66                 break;
67             case Direction.Left:
68                 nextPoint.X--;
69                 break;
70             case Direction.Up:
71                 nextPoint.Y--;
72                 break;
73             default:
74                 throw new InvalidOperationException();
75         }
76 
77         return nextPoint;
78     }
79 
80     Direction NextDirection(Direction direction)
81     {
82         return (Direction)(((int)direction + 1) % 4);
83     }
84 
85     private int this[Point index]
86     {
87         get
88         {
89             if (index.X < 0 || index.X >= Count || index.Y < 0 || index.Y >= Count)
90                 return -1;
91 
92             return numbers[index.X, index.Y];
93         }
94 
95         set { numbers[index.X, index.Y] = value; }
96     }
97 }

程序用的算法比较简单,是一种最直接的算法:不停的往前走,碰壁便转弯。总体感觉整体思路还比较清晰,这里记录一下。

转载于:https://www.cnblogs.com/TianFang/archive/2010/12/27/1918330.html

一个打印螺旋数的程序相关推荐

  1. 编写一个打印全年日历的程序

    /* 判断闰年3 如果知道某年元月一日是星期几,能否在本程序的基础上, 编写一个打印全年日历的程序? */ #include <iostream> using namespace std; ...

  2. python 打印自己代码_如何编写一个打印自身源代码的程序

    一个程序,在没有任何外部输入的情况下,打印自身的源代码,这类程序在英文里有一个专门的称呼,叫做Quine,之所以叫这个名字,是为了纪念美国哲学家及逻辑学家Willard Van Orman Quine ...

  3. Linux环境下编写一个shell程序,此程序的功能:随机生成一个1-100的数(答案)让用户猜

    题目:编写一个shell程序,此程序的功能:随机生成一个1-100的数(答案)让用户猜,如果用户猜的数大于答案,则提示大了,如果用户猜的数小于答案,则提示小了.当用户猜对时提示:猜对了. #! /bi ...

  4. 程序实现:由给定几个数确定凸组合系数,组成一个给定的数

    问题描述 给定几个数xix_ixi​确定凸组合系数λi\lambda_iλi​,组成一个给定的数xxx. ∑λixi=x\sum \lambda_ix_i=x∑λi​xi​=x s.t.∑λi=1s. ...

  5. Java黑皮书课后题第6章:*6.15(金融应用:打印税表)程序清单3-5给出了计算税款的程序。使用下面的方法体编写一个计算税款的方法。使用这个方法编写程序,打印可征税人从50000到60000间隔

    *6.15(金融应用:打印税表)程序清单3-5给出了计算税款的程序.使用下面的方法体编写一个计算税款的方法.使用这个方法编写程序 题目 题目描述 破题 程序清单3-5(非本题):代码不全 补充代码:编 ...

  6. 编写一个制造各种车辆的程序。包含三个类,具体要求如下: (1)基类Vehicle,包含轮子数和汽车自身重量两个属性,一个两参数的构造方法,一个显示汽车信息的方法; (2)小轿车类Car,增加载客数属性

    一.题目描述 编写一个制造各种车辆的程序.包含三个类,具体要求如下: (1)基类Vehicle,包含轮子数和汽车自身重量两个属性,一个两参数的构造方法,一个显示汽车信息的方法: (2)小轿车类Car, ...

  7. 12.15有一种数叫回文数,正读和反读都一样,如12321便是一个回文数。编写一个程序,从命令行得到一个整数,判断该数是不是回文数

    有一种数叫回文数,正读和反读都一样,如12321便是一个回文数.编写一个程序,从命令行得到一个整数,判断该数是不是回文数 package Text6;import java.util.Scanner; ...

  8. 有一种数叫回文数,正读和反读都一样,如12321便是一个回文数。编写一个程序,从命令行得到一个整数,判断该数是不是回文数。

    package task08;import java.util.Scanner;/** 8.有一种数叫回文数,正读和反读都一样,如12321便是一个回文数.* 编写一个程序,从命令行得到一个整数,判断 ...

  9. matlab求点介数程序,matlab_bgl 一个很有用的计算网络中每个节点介数的程序,对 分析 Cloud Computing 云 266万源代码下载- www.pudn.com...

    文件名称: matlab_bgl下载  收藏√  [ 5  4  3  2  1 ] 开发工具: Others 文件大小: 2098 KB 上传时间: 2016-10-26 下载次数: 0 提 供 者 ...

最新文章

  1. 【ArrayList】为什么java.util.concurrent 包里没有并发的ArrayList实现?
  2. dp聚类算法_【深度】基于残差分析的混合属性数据聚类算法
  3. MATrICP论文解读
  4. ASP.NET ActionPack
  5. stm32 通用bootloader_stm32最简单的实现BootLoader
  6. js数组常用方法总结(包括ES6)
  7. js右下角广告[兼容]
  8. html调用eps,eps输出没有属性
  9. AWVS扫描器使用入门
  10. 全新开发萝卜影视源码金色版 视频影视系统APP源码
  11. 什么是噪声,白噪声,加性噪声,乘性噪声
  12. python while循环详解
  13. Excel教程: Excel的窗口冻结与拆分
  14. 安装UWP版网易云音乐
  15. 详解统计指标PV、IP、UV、VV
  16. Redis简介与基本使用
  17. 氚云徐平俊:低代码赛道热度陡升,今年增长目标200%
  18. 浙大版《C语言程序设计(第3版)》题目集
  19. JAVA 接口 验证哥特巴赫猜想
  20. 狸窝全能转换器安卓版_第三十二讲 如何运用“狸窝”剪辑视频

热门文章

  1. Spring Cloud Alibaba基础教程:支持的几种服务消费方式(RestTemplate、WebClient、Feign)
  2. Centos7安装tengine-2.3.2版本
  3. Qt 3D的未来展望
  4. AFIO时钟何时开启
  5. 浪潮NF5270M3 刷uefi_新零售浪潮中,开为科技利用刷脸支付帮门店“运营”人
  6. 编译linux-2.6.29内核,报错解决方法
  7. Cpp / 空指针对象调用函数的不同结果
  8. Cpp 对象模型探索 / 拷贝构造函数 和 赋值构造函数 的调用时机
  9. 用启明云端基于ESP32模块的开发板来快速了解天猫精灵
  10. 3 左右_3万左右电动迷你小汽车,3万左右电动迷你小汽车车型推荐