蛇形矩阵

今天参加了国内某公司的在线笔试,其中一道编程题为要求生成蛇形矩阵。

时间较为仓促,初步的代码如下

public class SnakeMatrix {

	private static int index;
	
	public static void main01(String[] args) {
		// TODO Auto-generated method stub
		index = 5;
		setSnakeMatrix(index);
		System.out.println("Finish!");
	}
	public static void printSnakeMatrix(int[][] snakeMatrix, int index){
		for(int i = 0; i < index; i++){
			for(int j = 0; j < index; j++){
				System.out.print(snakeMatrix[i][j] + "\t");
			}
			System.out.print("\n");
		}
	}
	public static void setSnakeMatrix(int index){
		if(index <= 0){
			System.out.println("Invilid index!");
			return;
		}
		
		int indexTmp = index; // set temp of index
		int[][] snakeMatrix = new int[indexTmp][indexTmp];
		
		int columnTmp = 0;
		int rowTmp = 0;
		int curColumn = 0;
		int curRow = 0;
		
		int indexTmpTmp = indexTmp;
		int cnt = 0;
		int dir = 0;
		int numNum = indexTmp * indexTmp;
		while (cnt != numNum) {
			indexTmpTmp = indexTmp;
			if(dir == 0){ // right direction
				for(int i = curColumn; i < curColumn + indexTmpTmp; i++){
					cnt++;
					snakeMatrix[curRow][i] = cnt;
				}
				dir = 1;
				curRow++;
			} else if(dir == 1){ // down direction
				indexTmpTmp = indexTmpTmp - 1;
				columnTmp = index - curColumn - 1;
				for(int i = curRow; i < curRow + indexTmpTmp; i++){
					cnt++;
					snakeMatrix[i][columnTmp] = cnt;
				}
				dir = 2;
			} else if(dir == 2){ // left direction
				rowTmp = index - curRow;
				for(int i = index - curColumn - 2; i >= curColumn; i--){
					cnt++;
					snakeMatrix[rowTmp][i] = cnt;
				}
				dir = 3;
			} else if(dir == 3){ // up direction
				columnTmp = curColumn;
				for(int i = index - curRow - 1; i >= curRow; i--){
					cnt++;
					snakeMatrix[i][columnTmp] = cnt;
				}
				
				curColumn++;
				dir = 0;
			}
			if(dir == 0)
				indexTmp -= 2;
		}
		
		printSnakeMatrix(snakeMatrix, index);
	}
}

想了一下,觉得直接进行计算也是可行的,尝试了下,对应代码如下

public class SnakeMatrix01 {

	private static int index;
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		index = 10;
		setSnakeMatrix(index);
	}
	/**
	 * print elements of the snake matrix in matrix view
	 * @param snakeMatrix the snake matrix
	 * @param index index of the matrix
	 */
	public static void printSnakeMatrix(int[][] snakeMatrix, int index){
		System.out.print("\n");
		for(int i = 0; i < index; i++){
			for(int j = 0; j < index; j++){
				System.out.print("\t" + snakeMatrix[i][j]);
			}
			System.out.print("\n");
		}
	}
	/**
	 * set the snake matrix with given index
	 * @param index index of snake matrix
	 */
	public static void setSnakeMatrix(int index){
		if(index <= 0){
			System.out.println("Invilid index!");
			return;
		}
		// calculate the number of circles
		int circleNum = 0;
		if(index % 2 == 0){
			circleNum = index/2;
		}else{
			circleNum = index/2 + 1;
		}
		// get the largest number of each circle
		int[] maxEachCircle = new int[circleNum];
		int tmp = index;
		for(int i = 0; i < circleNum - 1; i++){
			if(i > 0){
				maxEachCircle[i] = 4*(tmp - 1) + maxEachCircle[i - 1];
			}else{
				maxEachCircle[i] = 4*(tmp - 1);
			}
			tmp -= 2; 
		}
		int indexSquare = index * index;;
		maxEachCircle[circleNum - 1] = indexSquare;
		// calculate the snake matrix
		int indexTmp = index; // set temp of index
		int[][] snakeMatrix = new int[indexTmp][indexTmp];
		
		int circleTmp = 0;
		
		for(int i = 0; i < index; i++){
			for(int j = 0; j < index; j++){
				circleTmp = calcCircleNum(i, j, circleNum);
				if(circleTmp > 0){
					snakeMatrix[i][j] = maxEachCircle[circleTmp - 1] + calcNum(i, j, circleTmp, index);
				} else{
					snakeMatrix[i][j] = calcNum(i, j, circleTmp, index);
				}
			}
		}
		printSnakeMatrix(snakeMatrix, index);
		
	}
	/**
	 * calculate circle number of current element
	 * @param row row number of current element
	 * @param column column number of current element
	 * @param totalCircleNum the maximum circles in the matrix
	 * @return circle number of element(row, column)
	 */
	public static int calcCircleNum(int row, int column, int totalCircleNum){
		int circleNum = 0;
		if(row > totalCircleNum - 1)
			row = index - 1 - row;
		if(column >= row && column <= index - row -1){
			// the circleNum seems to be row
			if(row <= totalCircleNum)
				circleNum = row;
			else
				circleNum = index - row - 1;
		}else{
			// the circleNum seems to be column
			if(column <= totalCircleNum - 1)
				circleNum = column;
			else
				circleNum = index - column - 1;
		}
		return circleNum;
	}
	/**
	 * calculate elements in the snake matrix
	 * @param row row number of current element
	 * @param column column number of current element
	 * @param circleNum the circle number of current element
	 * @param index index of snake matrix
	 * @return value of element(row, column)
	 */
	public static int calcNum(int row, int column, int circleNum, int index){
		int indexTmp = index - 2 * circleNum; // get new index
		int resultTmp = 0;
		if(row == circleNum){ // upper boundary
			resultTmp = column - (circleNum - 1); 
		}else if(row == index - circleNum - 1){ // lower boundary
			resultTmp = 2*indexTmp - 1 + (circleNum + indexTmp - column - 1);
		}else if(column == circleNum){ // left boundary
			resultTmp = indexTmp + (indexTmp - 1) + (indexTmp - 2) + (circleNum + indexTmp - row);
		}else if(column == index - circleNum - 1){ // right boundary
			resultTmp = indexTmp  + (row - circleNum);
		}
		return resultTmp;
	}
}

输出结果如下


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值