給出二維陣列,要求按順時針列印二維陣列。
例如給出
輸入 int arr[3]
輸出 [1,2,3,6,9,8,7,4,5]
順時針列印矩陣的順序是 「從左向右、從上向下、從右向左、從下向上」 迴圈。
1、求出用於返回列表的大小returnsize。
2、矩陣 左、右、上、下 四個邊界 l , r , t , b ,用於列印的結果列表 val 。
3、「從左向右、從上向下、從右向左、從下向上」 四個方向迴圈,每個方向列印中做以下三件事 (各方向的具體資訊見下表) ;
3.1根據邊界列印,即將元素按順序新增至列表 val 尾部;
3.2邊界向內收縮 1(代表已被列印);
3.3判斷是否列印完畢(邊界是否相遇),若列印完畢則跳出。
4、返回val
;//下面要走的是從上到下,所以先判斷上邊界+1是否比下邊界大,如果大說明已經列印完全。
// top to bottom.
for(
int i = t; i <= b; i++
)//從上到下,i就等於上,i<=下
if(l >
--r)
break
;//下面要走的是從右到左,所以先判斷左邊界是否比右邊界-1大,如果大說明已經列印完全。
// right to left.
for(
int i = r; i >= l; i--
)//從右到左,i就等於右,i>=左
if(t >
--b)
break
;//下面要走的是從下到上,所以先判斷上邊界是否比下邊界-1大,如果大說明已經列印完全。
// bottom to top.
for(
int i = b; i >= t; i--
)//從下到上,i就等於下,i>=上if(
++l > r)
break
;//下面要走的是從左到右,所以先判斷左邊界+1是否比右邊界大,如果大說明已經列印完全。
}return val;
}int
main()
;//用於接收val的列表的長度
int returnsize;
//定義arr2用來接收val的首位址
int*arr2 =
spiralorder
(arr,
&returnsize)
;//列印列表val
for(
int i =
0; i < returnsize; i++
)printf
("\n");
return0;
}執行結果
如果想列印3行4列或者其他多行多列,只要將一開始巨集定義的low 和 col數值一改,再將陣列的值填好,就可以了。
下面附上逆時針列印陣列的**,跟順時針列印的原理一模一樣。
#define low 3
#define col 3
intmain()
;int l =
0, r = col -
1, t =
0, b = low -1;
l =0, r = col -
1, t =
0, b = low -1;
printf
("逆時針列印二維陣列 ");
while(1
)if(++l > r)
break
;for
(int i = l; i <= r; i++)if
(t >
--b)
break
;for
(int i = b; i >= t; i--)if
(l >
--r)
break
;for
(int i = r; i >= l; i--)if
(++t > b)
break;}
return0;
}
順時針列印二維陣列
如果看不懂,可參照劍指offer128頁 include include using namespace std 方法一 傳vector 需要傳引用 方法二 傳二維指標 按圈給陣列賦值 void printmatrixincircle int vector numbers,int rows,int ...
順時針列印二維陣列
一 題目 要求 輸入乙個陣列,從外到裡順時針列印陣列中的元素,例如輸入矩陣 1,2,3,4 5,6,7,8 9,10,11,12 輸出 1,2,3,4,8,12,11,10,9,5,6,7 二 思路 按圈列印,記錄每圈的起始位置 行號 列號 特殊行或列需要判斷防止出現空指標異常。三 public c...
順時針螺旋列印二維陣列
想起來一道做過兩次的競賽題,明明之後重寫了標程第二次還是想不起來怎麼寫了,愣是連續兩次打表過 捂臉 題目 1,2,3 n n 的數字按照順時針螺旋的形式列印成矩陣,如下 輸入數字2,則程式輸出 1 24 3 輸入數字3,則程式輸出 1 2 3 8 9 4 7 6 5 輸入數字4,則程式輸出 1 2 ...