順、逆時針順序列印二維陣列
將一個二維陣列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
9、C語言中二維陣列及陣列名及指向二維陣列的指標變數
#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,