今天参加了国内某公司的在线笔试,其中一道编程题为要求生成蛇形矩阵。
时间较为仓促,初步的代码如下
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;
}
}
输出结果如下