1. 程式人生 > >1,2,3…n*n 的數字按照順時針螺旋的形式列印成矩陣(遞迴)

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;
	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;
}


當然也可以轉化為非遞迴式,這樣,只要把遞迴寫成圈數的迴圈即可。

相關推薦

1,2,3n*n數字按照時針螺旋形式列印矩陣

題目:1,2,3…n*n 的數字按照順時針螺旋的形式列印成矩陣,如下: 輸入數字2,則程式輸出: 1 2 4 3 輸入數字3,則程式輸出: 1 2 3 8 9 4 7 6 5 輸入數字4, 則程式輸出

輸入兩個整數n和m,從數列1,2,3,……n中隨意取幾個數,使其和等於m 轉載

輸出 -1 pri str spa private 組合 開始 () 題目:編程求解,輸入兩個整數n和m,從數列1,2,3,……n中隨意取幾個數,使其和等於m。要求將所有的可能組合列出來。 分析:分治的思想。可以把問題(m,n)拆分(m - n, n -1)和(m, n -

jzxx1570 1!+2!+3!+……+N

題目描述 用高精度計算出S=1!+2!+3!+…+n!(n≤50) 其中“!”表示階乘,例如:5!=54321。 輸入 一行,一個正整數N。 輸出 一行,一個正整數,即結果S。 樣例輸入 5 樣例輸出 153 滿分程式碼: #include<stdio

jzxx1570 1!+2!+3!+……+N

題目描述 用高精度計算出S=1!+2!+3!+…+n!(n≤50) 其中“!”表示階乘,例如:5!=54321。 輸入 一行,一個正整數N。 輸出 一行,一個正整數,即結果S。 樣例輸入 5 樣例輸出 153 滿分程式碼: #include<stdio.h

2求和。1+2+3+4+....n.

問題及程式碼: 2711: 用遞迴求和。1+2+3+4+....n. Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 1553  Solved: 10

程式設計求解,輸入兩個整數n和m,從數列1,2,3,……n中隨意取幾個數,使其和等於m。要求將所有的可能組合列出來揹包問題求解 .

程式設計求解,輸入兩個整數n和m,從數列1,2,3,……n中隨意取幾個數,使其和等於m。要求將所有的可能組合列出來。實際上就是一個揹包問題。 求解思路: 1.首先判斷,如果n>m,則n中大於m的數不可能參與組合,此時置n = m; 2.將最大數n加入且n == m,則

【 51NOD 1434 素數篩 】【數論+思維+篩素數】區間LCM【找到一個最小整數M,滿足M>N,LCM(N+1,N+2,..,M-1,M)是LCM(1,2,3,4,.,N-1,N) 的倍數】

思路: 雖然是四級題,但是思路還是不太清晰,找網上題解講的很多不是特別清晰(可以隨便舉些例子理解一下) 首先可以得出一個性質:LCM(1,2,3,4,...,N-1,N) 中質因子k的出現的次數為t

1+2+3+4+……+n的和

#include <stdio.h> main() { int i,n,sum; printf("input,n:"); scanf("%d",&n); sum=0; for (i=1;i<

CF D - Beautiful Graphdfs 染色問題吧給你一個圖,每個節點可以賦值1,2,3三種數字,相鄰的節點的和必須是奇數,問有多少中方法。

題意: 給你一個圖,每個節點可以賦值1,2,3三種數字,相鄰的節點的和必須是奇數,問有多少中方法。 分析: 很容易就可以發現如果這個圖中是有奇數的環的話,那這是肯定不行的 ,否則這個環的貢獻是為2^sumji+2^sumou , 總貢獻為每個的環的貢獻相乘,一個點也為環; #in

1 2 3 4個數字,能組成多少個互不相同且無重複數字的三位數 都是多少

                題目:有1、2、3、4個數字,能組成多少個互不相同且無重複數字的三位數?都是多少? 解:程式分

N皇后問題

//八皇后遞迴解法 //#include<iostream> //using namespace std; #include<stdio.h> int queen[9] = {-1,-1,-1,-1,-1,-1,-1,-1,-1}; int count = 0;//定義一個全

2.3 如何得到真實的執行計劃 《基於Oracle的優化學習筆記

  if( hash_values.count > 0 ) then     for i in hash_values.first .. hash_values.last loop            dbms_output.put_line('----------------------------

演算法-N皇后

package MOOC; /** * 輸入整數n,要求n個國際皇后,擺在n*n的棋盤上,使其互相不能攻擊(不在同一行列對角線上),輸出全部方案 */ import java.util.Scann

Leetcode 129 求根到葉子節點數字之和

給定一個二叉樹,它的每個結點都存放一個 0-9 的數字,每條從根到葉子節點的路徑都代表一個數字。 例如,從根到葉子節點路徑 1->2->3 代表數字 123。 計算從根到葉子節點生成的所有數字之和。 說明: 葉子節點是指沒有子節點的節點。 示

【動態規劃】數字三角形最大值

題目:數字三角形,形如          3      3      2   4     5     1 1    3     4     1 每個點只能選擇向左或向右走,取一條路徑,使得路徑上數字和最大。 無需求出路徑,求出最大值。 輸入n,和 n 行數字三角形 n<

字元數字倒序輸出

不含空格版#include<stdio.h> void fun(char *p) { if(*p=='\0') return; fun(p+1); printf("%c",*p)

藍橋杯演算法訓練——2的次冪表示

問題描述   任何一個正整數都可以用2進製表示,例如:137的2進製表示為10001001。   將這種2進製表示寫成2的次冪的和的形式,令次冪高的排在前面,可得到如下表達式:137=2^7+2^3

《資料結構與演算法——C語言描述》答案 3.11 查詢單鏈表中的特定元素

轉載請註明出處:http://blog.csdn.net/xdz78 #include <stdio.h> #include <stdlib.h> //查詢單鏈表中的特定元

2的次冪表示

思路:這遞迴遞的我頭都暈了,先貼個偽遞迴吧 AC程式碼: #include <cstdio> #include <cstring> #include <algor

練習2-18 求組合數

本題要求編寫程式,根據公式C​n​m ​​=​ n! / m!(n−m)!​​​​算出從n個不同元素中取出m個元素(m≤n)的組合數。 建議定義和呼叫函式fact(n)計算n!,其中n的型別是int,函式型別是double。 輸入格式: 輸入在一行中給出兩個正整數m和n