Java實(shí)現(xiàn)的打印螺旋矩陣算法示例
本文實(shí)例講述了Java實(shí)現(xiàn)的打印螺旋矩陣算法。分享給大家供大家參考,具體如下:
一個(gè)N階矩陣順時(shí)針呈螺旋狀,形如下面的矩陣:

思路:使用一個(gè)二維數(shù)組存放數(shù)據(jù),數(shù)組初始化為0,數(shù)組共有n平方個(gè)元素,因?yàn)槭菑?開(kāi)始,所以元素的值是從1到n×n。按照上面的路線從1開(kāi)始遍歷一遍填入數(shù)據(jù),每填入一個(gè)數(shù)據(jù)時(shí)后,判斷邊界和方向(說(shuō)明,任意長(zhǎng)度和寬度都可以使用這個(gè)思路,本例使用N*N的矩陣說(shuō)明)。直接上代碼了:
package study.haishen.com;
/**
* @author Administrator
*
*/
public class SpiralMatrix {
/**
* @param n n階
* @return
*/
public int[][] createMatrix(int n)
{
int[][] matrix = new int[n][n];//n*n的二維數(shù)組,初始元素值都為0
int right = 1, down = 2, left = 3, up = 4;//分別表示右下左上四個(gè)方向
int direction = right;
int numb = n * n;//n階矩陣,共有n×n個(gè)數(shù)
int i = 0, j = 0;
for (int p = 1; p <= numb; p++)
{
matrix[i][j] = p;
//判斷方向向右的情況
if(direction == right)
{
//如果當(dāng)前位置的右面位置在右邊界內(nèi)且值還是初始值,則行不變,列號(hào)向右移動(dòng)一位
if (j + 1 < n && matrix[i][j + 1] == 0)
{
j++;
} else {//如果超出右邊邊界,或者右面的元素已經(jīng)被修改過(guò),則向下移動(dòng)一行,且將方向改為向下
i++;
direction = down;
continue;
}
}
//判斷方向向下的情況
if (direction == down)
{
//如果當(dāng)前位置的下面位置在下邊界內(nèi)且值還是初始值,則列不變,行號(hào)向下移動(dòng)一位
if (i + 1 < n && matrix[i + 1][j] == 0)
{
i++;
} else {//如果超出下邊界,或者下面的元素已經(jīng)被修改過(guò),則向左移動(dòng)一行,且將方向改為向左
j--;
direction = left;
continue;
}
}
//判斷方向向左的情況
if (direction == left)
{
//如果當(dāng)前位置的左面位置在左邊界內(nèi)且值還是初始值,則行不變,列號(hào)向左移動(dòng)一位
if (j - 1 >= 0 && matrix[i][j - 1] == 0)
{
j--;
} else {//如果超出左邊界,或者左面的元素已經(jīng)被修改過(guò),則向上移動(dòng)一行,且將方向改為向上
i--;
direction = up;
continue;
}
}
//判斷方向向上的情況
if (direction == up)
{
//如果當(dāng)前位置的上面位置在上邊界內(nèi)且值還是初始值,則列不變,行號(hào)向左移動(dòng)一位
if (i - 1 >= 0 && matrix[i - 1][j] == 0)
{
i--;
} else {//如果超出上邊界,或者上面的元素已經(jīng)被修改過(guò),則向右移動(dòng)一列,且將方向改為向右
j++;
direction = right;
continue;
}
}
}
return matrix;
}
/**
* 測(cè)試
* @param args
*/
public static void main(String[] args) {
int n = 10;
SpiralMatrix s = new SpiralMatrix();
int[][] data = s.createMatrix(n);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
System.out.print(data[i][j] + " ");
}
System.out.println();
}
}
}
運(yùn)行結(jié)果:

更多關(guān)于java算法相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。
相關(guān)文章
Spring Boot 如何自定義返回錯(cuò)誤碼錯(cuò)誤信息
這篇文章主要介紹了Spring Boot 如何自定義返回錯(cuò)誤碼錯(cuò)誤信息的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-08-08
Java編程Post數(shù)據(jù)請(qǐng)求和接收代碼詳解
這篇文章主要介紹了Java編程Post數(shù)據(jù)請(qǐng)求和接收代碼詳解,涉及enctype的三種編碼,post與get等相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11
Java Management Extensions管理擴(kuò)展原理解析
這篇文章主要介紹了Java Management Extensions管理擴(kuò)展原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
Java StringBuffer與StringBuilder有什么區(qū)別
當(dāng)對(duì)字符串進(jìn)行修改的時(shí)候,需要使用 StringBuffer 和 StringBuilder類(lèi),和String類(lèi)不同的是,StringBuffer和 StringBuilder類(lèi)的對(duì)象能夠被多次的修改,并且不產(chǎn)生新的未使用對(duì)象,本篇我們來(lái)分析分析它們的區(qū)別2023-01-01
java中的instanceof關(guān)鍵字詳細(xì)解讀
這篇文章主要介紹了java中的instanceof關(guān)鍵字詳細(xì)解讀,instanceof 是 Java 的保留關(guān)鍵字,它的作用是測(cè)試它左邊的對(duì)象是否是它右邊的類(lèi)的實(shí)例,返回 boolean 的數(shù)據(jù)類(lèi)型,需要的朋友可以參考下2024-01-01

