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();
}
}
}
}
相關文章
- 順時針列印矩陣矩陣
- Java 實現順時針螺旋二維陣列輸出Java陣列
- 斐波那契數列的第N項(1≤n≤10^18 矩陣快速冪)矩陣
- 從面試題中學演算法(2)---求陣列中唯一n個出現1次的數字(n=1,2,3)面試題演算法陣列
- 【原創】生成n*n蛇形矩陣的演算法矩陣演算法
- 【劍指offer】順時針列印矩陣矩陣
- 螺旋矩陣矩陣
- python之矩陣相加:提示使用者輸入矩陣的行數n,再提示使用者輸入矩陣的列數m,接下來,提示使用者輸入 2*n*m 個數字(每次輸入 一個數字)。輸出 C=A+B。Python矩陣
- 劍指offer-19:順時針列印矩陣矩陣
- JZ-019-順時針列印矩陣矩陣
- 求無序陣列總第n大的數陣列
- 生成螺旋矩陣(方陣、矩陣)矩陣
- JS實現順時針列印陣列JS陣列
- 給定一個大小為 n 的陣列,找到其中的眾數。眾數是指在陣列中出現次數大於 ⌊ n/2 ⌋ 的元素。陣列
- 遞迴和非遞迴分別實現求n的階乘遞迴
- 劍指offer面試題29:順時針列印矩陣面試題矩陣
- 6.5陣列--模擬、偏移量-螺旋矩陣陣列矩陣
- 【IDL】獲取n*n陣列的對角線元素的方法陣列
- 第四章:多維陣列和矩陣 --------------- 4.1 基礎題:順時針列印二維陣列陣列矩陣
- 劍指 Offer 29-順時針列印矩陣c++矩陣C++
- 力扣 - 劍指 Offer 29. 順時針列印矩陣力扣矩陣
- fibonacci斐波那契數列詳解 遞迴求Fn非遞迴求Fn求n最近的斐波那契數遞迴
- 建立包含N個空物件的陣列物件陣列
- 合併JavaScript陣列的N種方法JavaScript陣列
- 54. 螺旋矩陣矩陣
- c# 螺旋矩陣C#矩陣
- 給定一個按非遞減順序排序的整數陣列 A,返回每個數字的平方組成的新陣列,要求也按非遞減順序排序。排序陣列
- 【程式碼隨想錄】一、陣列:5.螺旋矩陣陣列矩陣
- 獲取陣列第N個元素的方法陣列
- leetcode:螺旋矩陣LeetCode矩陣
- 不能使用for迴圈,傳入n和m, 生成一個長度為n,每一項都是m的陣列陣列
- 從陣列中找出N個數,其和為M的所有可能陣列
- 【遞迴】小q的數列遞迴
- 如何新增javascript陣列n乘以相同的元素JavaScript陣列
- 力扣-54. 螺旋矩陣力扣矩陣
- Java語言非遞迴求第n個斐波那契數Java遞迴
- [每日一題] 第二十一題:順時針列印矩陣每日一題矩陣
- Python練習-LeetCode 第1篇 順時針列印矩陣PythonLeetCode矩陣