绘制数字缠绕矩阵

原创 2007年09月23日 12:21:00
        什么是数字缠绕矩阵呢? 呵呵,这个名字是我起的,好玩而已,举个例子大家就明白了:

01 02 03 04 05
16 17 18 19 06
15 24 25 20 07
14 23 22 21 08
13 12 11 10 09

01 20 19 18 17 16
02 21 32 31 30 15
03 22 33 36 29 14
04 23 34 35 28 13
05 24 25 26 27 12
06 07 08 09 10 11

     像这样的矩阵,由阿拉伯数组从外向内缠绕递增生成,就叫做数字缠绕矩阵了。当然,缠绕的方向分为顺时针和逆时针,第一个例子是顺时针,第二个例子是逆时针。
      这只是一个比较有趣的小程序,闲来无事写一个玩玩,代码如下:
public class Main {

    
//测试函数
    public static void main(String[] args) {
        NumMatrix nm 
= new NumMatrix();
        nm.run(
5, NumMatrix.DEASIL);
        System.out.println();
        nm.run(
6, NumMatrix.ANTICLOCKWISE);

    }



}


class NumMatrix {

    
public static final int DEASIL = 1;    //顺时针
    public static final int ANTICLOCKWISE = 2;    //逆时针

    
/**
     * 绘制出一个数字串缠绕矩阵
     * 
@param n    矩阵的尺寸
     * 
@param circle    数字串的旋转方向:顺时针或逆时针
     
*/

    
public void run(int n, int circle) {
        
int[][] a = new int[n][n];
        setNum(a);
        setCircle(circle);
        
while(true{
            
if(move(n, a)) {
                setNum(a);
                turnCount 
= 0;
            }
else {
                turn();
                
if(++turnCount == 2)
                    
break;
            }

        }

        
        
for(int i=0; i<n; i++{
            
for(int j=0; j<n; j++{
                System.out.print(String.format(
"%1$02d ", a[i][j]));
            }

            System.out.println();
        }

        
        reset();

    }

    
    
//重置各项参数,为下一次绘制做准备
    private void reset() {
        x 
= 0;
        y 
= 0;
        num 
= 1;
        arrow 
= RIGHT;
        turnCount 
= 0;
    }

    
    
//移动一格,若成功移动返回true,若撞墙则返回false
    private boolean move(int n, int[][] a) {
        
switch(arrow) {
        
case RIGHT:
            
if(y+1==|| a[x][y+1]>0)
                
return false;
            y
++;
            
break;
        
case DOWN:
            
if(x+1==|| a[x+1][y]>0)
                
return false;
            x
++;
            
break;
        
case LEFT:
            
if(y==0 || a[x][y-1]>0)
                
return false;
            y
--;
            
break;
        
case UP:
            
if(x==0 || a[x-1][y]>0)
                
return false;
            x
--;
            
break;
        }

        
return true;
    }

    
    
//将数字填入当前空白格子
    private void setNum(int[][] a) {
        a[x][y] 
= num++;
    }

    
    
//根据旋转方向为顺时针和逆时针,进行拐弯
    private void turn() {
        
switch(circle) {
        
case DEASIL:
            arrow 
= (arrow+1% 4;
            
break;
        
case ANTICLOCKWISE:
            arrow 
= (arrow+3% 4;
        }

        
    }

    
    
//设置旋转方向
    private void setCircle(int circle) {
        
this.circle = circle;
        
switch(circle) {
        
case DEASIL:
            arrow 
= RIGHT;
            
break;
        
case ANTICLOCKWISE:
            arrow 
= DOWN;
            
break;
        }

    }

    
    
private int turnCount = 0;
    
private int x = 0;
    
private int y = 0;
    
    
private int num = 1;
    
    
private final static int RIGHT = 0;
    
private final static int DOWN = 1;
    
private final static int LEFT = 2;
    
private final static int UP = 3;
    
    
private int circle;
    
private int arrow;
}

Graphic 矢量图形的区域填充与缠绕规则

1. 缠绕规则概念 增强的绘图 API 还引入了路径“缠绕”的概念:路径的方向。 路径的缠绕可以是正向的(顺时针),也可以是负向的(逆时针)。渲染器为 data 参数解释矢量所提供坐标的顺序确...
  • TKWDmylove
  • TKWDmylove
  • 2015年10月20日 14:19
  • 330

问题 E: 矩阵乘法

网站不太稳定。。。不太稳定。。。不稳定。。。 问题 E: 矩阵乘法 时间限制: 1 Sec  内存限制: 128 MB 提交: 13  解决: 4 [提交][状态][讨论版] 题目描...
  • z6_6z
  • z6_6z
  • 2017年12月10日 22:45
  • 47

quick-cocos2d-x绘制五角星精灵矩阵

quick-cocos2d-x绘制五角星
  • Code_Nice
  • Code_Nice
  • 2015年09月06日 14:05
  • 683

非零绕组规则与奇偶规则

该方法常用与判断点是否在多边形或曲线上。 给定一条曲线C和一个点P,构造一条从P点出发射向无穷远的射线。找出所有该射线和曲线的交点,并按如下规则统计绕组数量(winding number): ...
  • u013770512
  • u013770512
  • 2014年06月20日 17:44
  • 1036

Java 小例子:按照顺时针或逆时针方向输出一个数字矩阵

题目:按照指定的长宽和输出方向,从外向内打印一个从 1 开始的数字矩阵,矩阵的开始位置在左上角。...
  • YidingHe
  • YidingHe
  • 2015年11月19日 11:00
  • 3048

C语言旋转数字矩阵

题目要求:打印如下数字矩阵     01 02 03 04 05     16 17 18 19 06     15 24 25 20 07     14 23 22 21 08     13 12 ...
  • u011286042
  • u011286042
  • 2014年02月21日 17:41
  • 2124

剑指offer面试题:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字

题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 输入一个矩阵如下:  1     2     3    4  5     6     7    8  9    10   ...
  • yanxiaolx
  • yanxiaolx
  • 2016年08月19日 22:22
  • 2299

Python 绘制混淆矩阵函数 confusion_matrix

Python 绘制混淆矩阵函数 confusion_matrix代码如下:def plot_confusion_matrix(y_true, y_pred, labels): import m...
  • Konae
  • Konae
  • 2016年12月01日 16:17
  • 4482

回溯——矩阵中路径问题(0,1矩阵中最优路径、矩阵中的路径、机器人的运动范围)

问题一: 给定一个rows*cols 大小的0,1矩阵,给出起点和终点坐标,0可以走,1不可以走,每次只能向上下左右,走一步,求出从起点到终点的最短路径; 解题思路:回溯法解决的经典问题,由于回溯的递...
  • helloworldding
  • helloworldding
  • 2017年03月11日 22:13
  • 553

C++输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,

//输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字, //例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 //则依次打印出数字1...
  • liuhuiyan_2014
  • liuhuiyan_2014
  • 2015年05月06日 11:25
  • 1328
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:绘制数字缠绕矩阵
举报原因:
原因补充:

(最多只允许输入30个字)