Java實(shí)現(xiàn)的打印螺旋矩陣算法示例
本文實(shí)例講述了Java實(shí)現(xiàn)的打印螺旋矩陣算法。分享給大家供大家參考,具體如下:
一個(gè)N階矩陣順時(shí)針呈螺旋狀,形如下面的矩陣:
思路:使用一個(gè)二維數(shù)組存放數(shù)據(jù),數(shù)組初始化為0,數(shù)組共有n平方個(gè)元素,因?yàn)槭菑?開始,所以元素的值是從1到n×n。按照上面的路線從1開始遍歷一遍填入數(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)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總》
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。
相關(guān)文章
mybatis攔截器注冊(cè)初始化編寫示例及如何生效詳解
這篇文章主要為大家介紹了mybatis攔截器注冊(cè)初始化編寫示例及如何生效詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08java socket長(zhǎng)連接中解決read阻塞的3個(gè)辦法
這篇文章主要介紹了java socket長(zhǎng)連接中解決read阻塞的3個(gè)辦法,本文取了折中的一個(gè)方法,并給出代碼實(shí)例,需要的朋友可以參考下2014-08-08SpringBoot集成swagger-ui以及swagger分組顯示操作
這篇文章主要介紹了SpringBoot集成swagger-ui以及swagger分組顯示操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09Mybatis中 mapper-locations和@MapperScan的作用
這篇文章主要介紹了Mybatis中 mapper-locations和@MapperScan的作用,mybatis.mapper-locations在SpringBoot配置文件中使用,作用是掃描Mapper接口對(duì)應(yīng)的XML文件,需要的朋友可以參考下2023-05-05基于java實(shí)現(xiàn)停車場(chǎng)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了基于java實(shí)現(xiàn)停車場(chǎng)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11詳解SpringBoot中關(guān)于%2e的Trick
這篇文章主要介紹了SpringBoot中關(guān)于%2e的Trick,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04Mybatis分頁(yè)P(yáng)ageHelper插件代碼實(shí)例
這篇文章主要介紹了Mybatis分頁(yè)P(yáng)ageHelper插件代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-12-12淺析SpringBoot自動(dòng)裝配的實(shí)現(xiàn)
springboot開箱即用,其實(shí)實(shí)現(xiàn)了自動(dòng)裝配,本文重點(diǎn)給大家介紹SpringBoot是如何做到自動(dòng)裝配的,感興趣的朋友跟隨小編一起看看吧2022-02-02java?設(shè)計(jì)模式從風(fēng)控鏈理解責(zé)任鏈模式
這篇文章主要為大家介紹了java?設(shè)計(jì)模式從風(fēng)控鏈理解責(zé)任鏈模式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05Java Integer.valueOf()和Integer.parseInt()的區(qū)別說(shuō)明
這篇文章主要介紹了Java Integer.valueOf()和Integer.parseInt()的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08