回形数矩阵 时间复杂度O(n)
无构造函数 无递归 详解
题目如下:
打印一个矩阵:
当为3*3的矩阵时:
1 2 3
8 9 4
7 6 5
当为5*5的矩阵时:
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
解题步骤如下:
初始化一个空矩阵
对当前的位置进行判断,有4个可以移动的方向
但是只有一个符合规定的方向 , 用一个数字(0-3)表示下一次需要赋值的方向
0->向右移动
1->向下移动
2->向左移动
3->向上移动
按照这个方向对< i , j >坐标中的 i , j进行相应加减得到下一次的坐标
<i+1,j>或者<i-1,j>或者<i,j+1>或者<i,j-1>
再进行赋值
对于4*4的矩阵构造的坐标系:
代码:
public class HuiXinShu {
public static void main(String[] args) {
int ck = 4;//确定输入的是n*n的回形 二维数组
int[][] Hui = new int[ck][ck];
for (int p = 0; p < ck; p++) {
for (int q = 0; q < ck; q++) {
Hui[p][q] = 0;
}
}
//以左上角为坐标轴的原点
//向下是y轴正方向(也就是i)
//向右为x轴正方向(也就是j)
Hui[0][0] = 1;//<0,0>处为1
for (int p = 0; p < ck; p++) {//打印初始化的图形 (可以封装成函数)
for (int q = 0; q < ck; q++) {
System.out.print(Hui[p][q] + " , ");
}
System.out.println();
}
System.out.println();
System.out.println();
int fx_int = 0;//用于存放方向的符号
//0->向右移动
//1->向下移动
//2->向左移动
//3->向上移动
int num = 2;//需要在下个位置进行赋值 的值
//开始赋值的地方是<0,1>
int i = 0;
int j = 1;
for (int x = 1; x < Hui.length * Hui.length; x++) {//一共填入 x 平方的个数
Hui[i][j] = num;//对这个位置进行赋值
System.out.println("---------打印每次的图形-------------");//打印每次的图形 (可以封装成函数)
System.out.println("<" + i + "," + j + "> : " + num);
for (int p = 0; p < ck; p++) {
for (int q = 0; q < ck; q++) {
System.out.print(Hui[p][q] + " , ");
}
System.out.println();
}
boolean islop = false;//跳出下面的循环的标志
int n = fx_int;//下一次的次的方向 先和上次的方向一致 再顺时针进行判断
for (int o = fx_int; o < fx_int + 4; o++) {//顺时针进行4次,如果有可以移动的方向,就跳出循环(可以封装成函数)
if (islop) break;
switch (n) {
case 0:
if (j + 1 < ck) {
if (Hui[i][j + 1] != 0) {
break;
}
if (Hui[i][j + 1] < num) {
fx_int = 0;
islop = true;
//如果满足到这里的条件,那么它下一次移动的方向为:右
System.out.println("<" + i + "," + j + ">后面的方向" + "+0右+");
break;
}
}
break;
case 1:
if (i + 1 < ck) {
if (Hui[i + 1][j] != 0) {
break;
}
if (Hui[i + 1][j] < num) {
fx_int = 1;
islop = true;
//如果满足到这里的条件,那么它下一次移动的方向为:下
System.out.println("<" + i + "," + j + ">后面的方向" + "+1下+");
break;
}
}
break;
case 2:
if (j - 1 >= 0) {
if (Hui[i][j - 1] != 0) {
break;
}
if (Hui[i][j - 1] < num) {
fx_int = 2;
islop = true;
//如果满足到这里的条件,那么它下一次移动的方向为:左
System.out.println("<" + i + "," + j + ">后面的方向" + "+2左+");
break;
}
}
break;
case 3:
if (i - 1 >= 0) {
if (Hui[i - 1][j] != 0) {
break;
}
if (Hui[i - 1][j] < num) {
fx_int = 3;
islop = true;
//如果满足到这里的条件,那么它下一次移动的方向为:上
System.out.println("<" + i + "," + j + ">后面的方向" + "+3上+");
break;
}
}
break;
default:
break;
}
n = (n + 1) % 4;
}
//加减得到<i+1,j>或者<i-1,j>或者<i,j+1>或者<i,j-1>
switch (fx_int) {//根据下一次的次的方向,进行相应坐标系的加减 (可以封装成函数)
case 0:
j++;
break;
case 1:
i++;
break;
case 2:
j--;
break;
case 3:
i--;
break;
default:
break;
}
num++;
}
System.out.println("---------结果-------------");//打印结果的图形 (可以封装成函数)
for (int p = 0; p < ck; p++) {
for (int q = 0; q < ck; q++) {
System.out.print(Hui[p][q] + " , ");
}
System.out.println();
}
}
}