1,2,3…n*n 的數字按照順時針螺旋的形式列印成矩陣(遞迴)
題目:1,2,3…n*n 的數字按照順時針螺旋的形式列印成矩陣,如下:
輸入數字2,則程式輸出:
1 2
4 3
輸入數字3,則程式輸出:
1 2 3
8 9 4
7 6 5
輸入數字4, 則程式輸出:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
此題我的解題方法是遞迴,遞迴函式的作用就是列印當前圈,然後通過遞迴呼叫逐層列印內層,直到列印結束。程式相對比較簡單,所以就不加註釋了……
#include <iostream>
#include <string>
using namespace std;
void fuck(int a[][21],int num,int start_position,int n){
int i,x,y;
if(n==0)return;
if(n==1){
a[start_position][start_position]=num;
return ;
}
x=y=start_position;
a[x][y]=num;
num++;
for(i=0;i<n-1;++i){
++y;
a[x][y]=num;
num++;
}
for(i=0;i<n-1;++i){
++x;
a[x][y]=num;
num++;
}
for(i=0;i<n-1;++i){
--y;
a[x][y]=num;
num++;
}
for(i=0;i<n-2;++i){
--x;
a[x][y]=num;
num++;
}
fuck(a,num,start_position+1,n-2);
}
int main(){
int n;
int a[21][21];
cin>>n;
fuck(a,1,0,n);
for(int i=0;i<n;++i){
for(int j=0;j<n;++j){
cout<<a[i][j]<<"\t";
}
cout<<endl;
}
return 0;
}
java:
//matrix
public static void main(String[] args){
System.out.println("\t" +33);
System.out.println(1 + "\t" +33);
System.out.println(13 + "\t" +33);
Scanner in = new Scanner(System.in);
int size = in.nextInt();
in.close();
int[][] result = new int[size][size];
matrix(result,1,0,size);
for(int i=0;i<size;++i){
for(int j=0;j<size;++j){
System.out.print(result[i][j] + "\t");
}
System.out.println();
}
}
public static void matrix(int[][] result,int value,int startPosition,int level){
int x = startPosition;
int y = startPosition;
int n = value;
if(level == 0){
return;
}
if(level == 1){
result[x][y] = n;
return;
}
//normal situation
result[x][y] = n++;
for(int i=0;i<level-1;i++){
result[x][++y] = n++;
}
for(int i=0;i<level-1;i++){
result[++x][y] = n++;
}
for(int i=0;i<level-1;i++){
result[x][--y] = n++;
}
for(int i=0;i<level-2;i++){
result[--x][y] = n++;
}
matrix(result,n,startPosition+1,level-2);
}
當然也可以轉化為非遞迴式,這樣,只要把遞迴寫成圈數的迴圈即可。
非遞迴
import java.util.Scanner;
public class SnakeMatrix {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); //首先輸入矩陣的維數
int a[][] = new int[n][n]; //儲存所有元素的二維陣列
int count = 1; //計數器,每走一步加一
//把二維陣列從外到內一層一層剝開,按照上、右、下、左的順序走
// 注意臨界值條件,尤其是拐角別重疊覆蓋
for (int i = 0; i < n/2+1; i++) {
//up
for (int j = i; j < n-i; j++){
a[i][j]= count++;
}
//right
for (int j = i+1; j < n-i; j++){
a[j][n-i-1]= count++;
}
//down
for (int j = n-i-2; j >=i; j--){
a[n-i-1][j]= count++;
}
//left
for (int j = n-i-2; j >i; j--){
a[j][i]= count++;
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.print(a[i][j]+"\t");//將上面的for迴圈產生的數,進行遍歷輸出
if(j==n-1)//拐角處
System.out.println();
}
}
}
}
相關文章
- JZ-019-順時針列印矩陣矩陣
- python之矩陣相加:提示使用者輸入矩陣的行數n,再提示使用者輸入矩陣的列數m,接下來,提示使用者輸入 2*n*m 個數字(每次輸入 一個數字)。輸出 C=A+B。Python矩陣
- 螺旋矩陣矩陣
- 劍指offer-19:順時針列印矩陣矩陣
- 【IDL】獲取n*n陣列的對角線元素的方法陣列
- 給定一個大小為 n 的陣列,找到其中的眾數。眾數是指在陣列中出現次數大於 ⌊ n/2 ⌋ 的元素。陣列
- fibonacci斐波那契數列詳解 遞迴求Fn非遞迴求Fn求n最近的斐波那契數遞迴
- 遞迴和非遞迴分別實現求n的階乘遞迴
- leetcode:螺旋矩陣LeetCode矩陣
- 6.5陣列--模擬、偏移量-螺旋矩陣陣列矩陣
- 第四章:多維陣列和矩陣 --------------- 4.1 基礎題:順時針列印二維陣列陣列矩陣
- 建立包含N個空物件的陣列物件陣列
- 劍指offer面試題29:順時針列印矩陣面試題矩陣
- Python練習-LeetCode 第1篇 順時針列印矩陣PythonLeetCode矩陣
- 力扣 - 劍指 Offer 29. 順時針列印矩陣力扣矩陣
- 劍指 Offer 29-順時針列印矩陣c++矩陣C++
- 54. 螺旋矩陣矩陣
- 977.有序陣列的平方 ,209.長度最小的子陣列 ,59.螺旋矩陣II陣列矩陣
- 如何新增javascript陣列n乘以相同的元素JavaScript陣列
- 獲取陣列第N個元素的方法陣列
- 給定一個按非遞減順序排序的整數陣列 A,返回每個數字的平方組成的新陣列,要求也按非遞減順序排序。排序陣列
- 【程式碼隨想錄】一、陣列:5.螺旋矩陣陣列矩陣
- 不能使用for迴圈,傳入n和m, 生成一個長度為n,每一項都是m的陣列陣列
- [Leetcode]59.螺旋矩陣ⅡLeetCode矩陣
- 從陣列中找出N個數,其和為M的所有可能陣列
- 構造一個自定義二維 N*N 矩陣,從左上角第一個單元格依次填入1 - N*N的數字,從矩陣中指定單元格出發,經過相鄰的單元格(不可重複),走 X 步,輸出所有可能的路徑和每條路徑單元格對應的數字。矩陣
- 【遞迴】小q的數列遞迴
- LeetCode-N9-迴文數LeetCode
- Day2| 977.有序陣列的平方 ,209.長度最小的子陣列 ,59.螺旋矩陣II陣列矩陣
- Day2 |977.有序陣列的平方& 209.長度最小的子陣列&59.螺旋矩陣II陣列矩陣
- 我用js完成了按n位數的來進行分割陣列JS陣列
- [每日一題] 第二十一題:順時針列印矩陣每日一題矩陣
- 數列遞推形式的極限&正定,負定,不定與形式導數
- 力扣-54. 螺旋矩陣力扣矩陣
- Java語言非遞迴求第n個斐波那契數Java遞迴
- [20210624]find -mtime +N N -N的時間範圍問題.txt
- 寫一個方法,傳入數字x,從一個一維陣列裡找到兩個數字符合“n1 + n2 = x”陣列
- LeetCode989——陣列形式的整數加法LeetCode陣列
- Nth Digit 第N個數字Git