1. 程式人生 > >順、逆時針順序列印二維陣列

順、逆時針順序列印二維陣列

將一個二維陣列a[n][n],由陣列中心位置a[n/2][n/2]開始,按順、逆時針順序列印陣列的每個元素。
主要思路:按層(圈)列印,每次列印一層(圈)。n為奇數、偶數時分別考慮不同情況。將每層資料列印完,程式結束。
如a[7][7], 中心數字是a[3][3];除去中心數字外,a陣列需要列印三層資料。

#include <iostream>
using namespace std;

//////////////逆時針輸出所有元素////////////////
void Anticlockwise(int n)
{
    /////建立二維陣列並列印////////
    int** a = new int*[n];
    for (int i = 0
;i < n;i++) { a[i] = new int[n]; for (int j = 0;j < n; j++) { a[i][j] = n * i + j + 1; printf("%2d ", a[i][j]); // 保持輸出格式對齊 } printf("\n"); } printf("\n"); printf("逆時針輸出:\n"); if (n % 2) // n為奇數時 { int
column = n / 2; // 開始輸出位置,column是列號,row是行號 int row = n / 2; printf("中心數字:%2d\n", a[row][column]); // 輸出中心數字 for (int i = 1;i <= n / 2;i++) // 按層(圈)輸出,n是奇數時,包圍中心數字的層數是n/2層 { printf("第%d層數字:", i); column++; // 先從數字的右邊開始輸出 for (int
j = 0; j < i * 2; j++) // 輸出右邊的數字,數字共有i*2個,i是層數。 { printf("%2d ", a[row][column]); if (j != (i * 2 - 1)) // 輸出一個數字,行數+1,輸出最後一個數字時,行號不用變 row++; } for (int j = 0; j < i * 2; j++) // 輸出下邊的數字,數字共有i*2個,i是層數。 { column--; // 輸出一個數字前,列數-1 printf("%2d ", a[row][column]); } for (int j = 0; j < i * 2; j++) // 輸出左邊的數字,數字共有i*2個,i是層數。 { row--; // 輸出一個數字前,行數-1 printf("%2d ", a[row][column]); } for (int j = 0; j < i * 2; j++) // 輸出上邊的數字,數字共有i*2個,i是層數。 { column++; // 輸出一個數字前,列數+1 printf("%2d ", a[row][column]); } printf("\n"); // 一層數字輸出完成,換行輸出下一層。 } } else // n是偶數時 { int column = n / 2 - 1; // 開始輸出位置,column是列號,row是行號 int row = n / 2; // 定位到第一個輸出數的左下位置。 for (int i = 1;i <= n / 2;i++) // 按層(圈)輸出,n是偶數時,總共的層數是n/2層 { printf("第%d層數字:", i); column++; // 從右邊開始輸出 for (int j = 0; j < i * 2 - 1; j++) // 輸出右邊的數字,數字共有i*2-1個,i是層數。 { if (i == 1) // 第一層與其它層的情況不同,第一層時,用特別情況表明 continue; // 第一層時,右邊的第一個數先不輸出,最後再輸出 printf("%2d ", a[row][column]); if (j != (i * 2 - 2)) // 輸出一個數字,行數-1,輸出最後一個數字時,行號不用變 row--; } for (int j = 0; j < i * 2 - 1; j++) // 輸出上邊的數字,數字共有i*2-1個,i是層數。 { if (i == 1) // 第一層與其它層的情況不同,第一層時,用特別情況表明 row--; // 第一層時,輸出上邊的數字只要行數-1 else column--; // 輸出一個數字前,列數-1 printf("%2d ", a[row][column]); } for (int j = 0; j < i * 2 - 1; j++) // 輸出左邊的數字,數字共有i*2-1個,i是層數。 { if (i == 1) // 第一層與其它層的情況不同,第一層時,用特別情況表明 column--; // 第一層時,輸出右邊的數字時只要列數-1 else row++; // 輸出一個數字前,行數+1 printf("%2d ", a[row][column]); } for (int j = 0; j < i * 2 - 1; j++) // 輸出下邊的數字,數字共有i*2-1個,i是層數。 { if (i == 1) // 第一層與其它層的情況不同,第一層時,用特別情況表明 row++; // 第一層時,輸出下邊的數字時只要行數+1 else column++; // 輸出一個數字前,列數+1 printf("%2d ", a[row][column]); } if (i == 1) // 輸出第一層時,為了保證迴圈的不變性,要輸出右邊的數字。 { column++; // 這樣下一次迴圈又能從右邊開始。 printf("%2d ", a[row][column]); } printf("\n"); // 一層數字輸出完成,換行輸出下一層。 } } delete[]a; } //////////////順時針輸出所有元素//////////////// void Clockwise(int n) { /////建立二維陣列//////// int** a = new int*[n]; for (int i = 0;i < n;i++) { a[i] = new int[n]; for (int j = 0;j < n; j++) { a[i][j] = n * i + j + 1; } } printf("順時針輸出:\n"); if (n % 2) // n為奇數時 { int column = n / 2; // 開始輸出位置,column是列號,row是行號 int row = n / 2; printf("中心數字:%2d\n", a[row][column]); // 輸出中心數字 for (int i = 1;i <= n / 2;i++) // 按層(圈)輸出,n是奇數時,包圍中心數字的層數是n/2層 { printf("第%d層數字:", i); column--; // 先從數字的左邊開始輸出 for (int j = 0; j < i * 2; j++) // 輸出左邊的數字,數字共有i*2個,i是層數。 { printf("%2d ", a[row][column]); if (j != (i * 2 - 1)) // 輸出一個數字,行數-1,輸出最後一個數字時,行號不用變 row--; } for (int j = 0; j < i * 2; j++) // 輸出上邊的數字,數字共有i*2個,i是層數。 { column++; // 輸出一個數字前,列數+1 printf("%2d ", a[row][column]); } for (int j = 0; j < i * 2; j++) // 輸出右邊的數字,數字共有i*2個,i是層數。 { printf("%2d ", a[row][column]); row++; // 輸出一個數字,行數+1 } for (int j = 0; j < i * 2; j++) // 輸出下邊的數字,數字共有i*2個,i是層數。 { column--; // 輸出一個數字前,列數-1 printf("%2d ", a[row][column]); } printf("\n"); // 一層數字輸出完成,換行輸出下一層。 } } else // n是偶數時 { int column = n / 2; // 開始輸出位置,column是列號,row是行號 int row = n / 2; // 定位到第一個輸出數的右下位置 for (int i = 1;i <= n / 2;i++) // 按層(圈)輸出,n是偶數時,總共的層數是n/2層 { printf("第%d層數字:", i); column--; // 從左邊開始輸出 for (int j = 0; j < i * 2 - 1; j++) // 輸出左邊的數字,數字共有i*2-1個,i是層數。 { if (i == 1) // 第一層與其它層的情況不同,第一層時,用特別情況表明 continue; // 第一層時,左邊的第一個數先不輸出,最後再輸出 printf("%2d ", a[row][column]); if (j != (i * 2 - 2)) // 輸出一個數字,行數-1,輸出最後一個數字時,行號不用變 row--; } for (int j = 0; j < i * 2 - 1; j++) // 輸出上邊的數字,數字共有i*2-1個,i是層數。 { if (i == 1) // 第一層與其它層的情況不同,第一層時,用特別情況表明 row--; // 第一層時,輸出上邊的數字只要行數-1 else column++; // 輸出一個數字前,列數+1 printf("%2d ", a[row][column]); } for (int j = 0; j < i * 2 - 1; j++) // 輸出右邊的數字,數字共有i*2-1個,i是層數。 { if (i == 1) // 第一層與其它層的情況不同,第一層時,用特別情況表明 column++; // 第一層時,輸出右邊的數字時只要列數+1 else row++; // 輸出一個數字前,行數-1 printf("%2d ", a[row][column]); } for (int j = 0; j < i * 2 - 1; j++) // 輸出下邊的數字,數字共有i*2-1個,i是層數。 { if (i == 1) // 第一層與其它層的情況不同,第一層時,用特別情況表明 row++; // 第一層時,輸出下邊的數字時只要行數+1 else column--; // 輸出一個數字前,列數+1 printf("%2d ", a[row][column]); } if (i == 1) // 輸出第一層時,為了保證迴圈的不變性,要輸出左邊的數字。 { column--; // 這樣下一次迴圈又能從左邊開始。 printf("%2d ", a[row][column]); } printf("\n"); // 一層數字輸出完成,換行輸出下一層。 } } delete[]a; } int main() { int n; printf("請輸入n:"); while (scanf("%d", &n) != EOF) { Anticlockwise(n); printf("\n"); Clockwise(n); printf("\n"); } return 0; }

執行結果:這裡寫圖片描述

相關推薦

逆時針順序列印陣列

將一個二維陣列a[n][n],由陣列中心位置a[n/2][n/2]開始,按順、逆時針順序列印陣列的每個元素。 主要思路:按層(圈)列印,每次列印一層(圈)。n為奇數、偶數時分別考慮不同情況。將每層資料列印完,程式結束。 如a[7][7], 中心數字是

時針列印陣列(螺旋輸出陣列

題目:給定一個數組,將該陣列從第一個元素開始順時針打印出來。 分析:先考慮列印周圍一圈的問題,然後可以使用遞迴求解,直到最後全都列印完為止。也就是先列印最外圍的數,然後對於元二維陣列中間的陣列作為一個新的陣列,重新列印該新陣列的外圍的數,直到最後全部列印完為止

對角線列印陣列問題

1 前言 最近在網上看到這樣一道面試題:二維陣列(N*N),沿對角線方向,從右上角列印到左下角如N=4: 4*4二維陣列 { 1 2 3 4 } { 5 6 7 8 } { 9 10 11 12 } {13 14 15 16 } 列印順序 4 3 8 2 7 1

Java中Arrays.toString ()列印陣列及Array陣列的常用操作

1.Java中Arrays.toString () 已知列印一維陣列的API為System.out.println ( Arrays.toString ();,其引數為陣列名或陣列指標,其支援的資料型別有很多,如:int[]、char[]、byte[]等。 import java

Chorme瀏覽器中for迴圈裡面console.log列印陣列,展開後資料全部一樣,出現value below was evaluated just now問題

前言 之前在做蟻群演算法研究時,遇到資料爆炸,想列印檢視js資料極限點,於是設定迭代次數為5,預期是每次迭代就列印一次資訊數矩陣,5次迭代列印5組不同的二維陣列,好來檢視每次迴圈中資訊素的變化情況。但是console.log出來的所有資料是一樣的,點選右上角的感嘆號,出現V

GO語言最右邊斜列印陣列

例如如下的二維陣列 var arr = [][]int{ {1, 2, 3, 4, 5, 6}, {7, 8, 9, 10, 11, 12}, {13, 14, 15, 16, 17, 18}, {19, 20, 21, 22, 23, 24

9C語言中陣列陣列名及指向陣列的指標變數

#include <stdio.h> #include <stdlib.h> //與二維陣列相關的指標變數([] 比 *優先順序高) //在一般指標變數指向二維陣列,或者n維陣列,要直接操作a[i][j],對指標的操作必須有兩個符號(其中不出現&,如果有&則相應的加

java 利用一陣列陣列列印楊輝三角

列印楊輝三角 一維陣列 Triggle1.java package 第一章; //利用一維陣列列印楊輝三角 import java.util.Scanner; public class Triggl

【劍指offer{1-3}】陣列查詢空格替換從尾到頭列印連結串列

注:程式碼均在牛客網上執行,結果均通過! 二維陣列查詢 題目描述 在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函

【刷題】day01--對稱的叉樹叉樹列印成多行陣列的查詢替換空格

[程式設計題]對稱的二叉樹 熱度指數:90872時間限制:1秒空間限制:32768K 演算法知識視訊講解 請實現一個函式,用來判斷一顆二叉樹是不是對稱的。注意,如果一個二叉樹同此二叉樹的映象是同

2014年美團校招之——陣列逆時針旋轉45度後列印

思路: 沿著斜線列印即可。 public void print_rotate_matrix(int[] matrix , int n){ if(n<0||matrix==null||matrix.length==0) return; //列

寫一方法,列印等長的陣列,要求從1開始的自然數由方陣的最外圈向內螺旋方式地順序排列。 如: n = 4 則列印

/* * 22、 寫一方法,列印等長的二維陣列, * 要求從1開始的自然數由方陣的最外圈向內螺旋方式地順序排列。 如: n = 4 則列印: 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 */ public class Test22 {

美團——股票交易日陣列列印奇數位丟棄字元編碼(哈弗曼編碼)

股票交易日和二維陣列列印這兩道題就是time to sell stock和蛇形矩陣。 題目奇數位丟棄:(關於LinkedList和listIterator的使用) 對於一個由0..n的所有數按升序組成的序列,我們要進行一些篩選,每次我們取當前所有數字中從小到大的第奇

2.Java陣列_一陣列陣列的動態初始化與靜態初始化方法接收/返回/修改陣列java對陣列的排序/全拷貝/部分拷貝

Java陣列----引用資料型別,必須在使用前先初始化;否則會nullPointerException(執行時異常)。 (引用傳遞:多個棧記憶體指向同一塊堆記憶體) 1.一維陣列初始化 (1)動態初始化(宣告並開闢陣列) 資料型別[] 陣列名稱 = new 資料型別[長度]; 如

陣列(矩陣)時針旋轉90°

1.先轉置 2.後調換列元素     public void rotate(int[][] matrix){        //矩陣轉置程式碼        &n

JavaScript 一陣列陣列去重方法

1.使用ES6語法 set方法陣列去重:: a=[1,2,3,4,1,2,3,4]; [...new Set(a)]; //[1, 2, 3, 4] 2.一維陣列去重方法 function unique1(array){ var n = []; //一個新的臨時陣列

【C語言】一陣列陣列與指標

一維陣列和指標: 1、一維陣列名: 對於這樣的一維陣列:int a[4];  a作為陣列名就是我們陣列的首地址, a是一個地址常量 .  首先說說常量和變數的關係, 對於變數來說, 用箱子去比喻再好不過了, 宣告一個變數就宣告一個箱子,比如我們開闢出一個蘋果型別的箱子, 給這個變

【劍指offor】1陣列中的查詢

題目連結: 二維陣列中的查詢 題目描述: 在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。 解題思路 兩種思路 方法1

Java第一次作業:規範化輸出陣列排序問題

2. (15分)某省居民電價分三個“階梯”:月用電量50度以內的,電價為0.538元/度;用電量在51度至200度之間的,電價為0.568元/度,用電量超過200度的,電價為0.638元/度。編寫程式,使用者從鍵盤輸入用電量,程式輸出使用者應繳納的電費。 (輸入輸出介面,迴圈)(格式化輸出)

關於javascript的陣列陣列關聯陣列

陣列: 什麼是:記憶體中連續儲存多個數據的記憶體空間 為什麼:便於批量管理和操作多個相關的資料 建立陣列: 有3種建立方法; (1)建立一個空陣列: var arr=[]; var arr=new Array(); (2)建立陣列時就初始化值:var arr=[45,