蛇形矩陣
右下,下左,左上,上右,迴圈往復~如果每次迴圈都計算x, y當前的極限值會很耗費效能, 不如讓x和y直接越界,當越界的點不存在時,再回退一步,並按照"對方"上次的極限值(最大或最小),去確定"正確的轉向方向(左或右)
import time
import sys
"""# x變化或y變化
x和y只能有乙個工作(0為x工作, 1為y工作, 初始為1)
x_y_work = 1
設定狀態 add_or_cut:
第一位控制x: 0為增加, 1為減小
第二位控制y: 0為增加, 1為減小
初始為:[0, 0]
"""# 嘗試移除座標,成功則返回0,移除失敗, 則返回1
def remove_atom(x_y_list, snake_node, result_list):
# time.sleep(1)
if snake_node in x_y_list:
x_y_list.remove(snake_node)
print(snake_node)
print("剩餘元素",len(x_y_list),"個!")
return 0
else:
return 1
# 將二維列表轉換為實際的數字位置
def l_to_num(n, result_list):
for n in range(len(result_list)):
result_list[n] = result_list[n][0] * n + result_list[n][1] + 1
return result_list
def main():
# 確定邊長
n = input("請輸入邊長:")
try:
n = int(n)
except exception as e:
print("輸入的必須為整數,請重新輸入!")
sys.exit()
# 決定x或y工作
x_y_work = 1
# 決定x或y加還是減, 0為加, 1為減
add_or_cut = [0, 0]
# 當前所在的位置
source_x = 0
source_y = 0
x_y_list = [[x,y] for x in range(n) for y in range(n)]
result_list = list()
print("原始的地圖為:")
for m in range(n):
for n in range(n):
print(x_y_list[m+n],end=",")
print("")
# 開始移動
while len(x_y_list) != 0:
print("開始一次迴圈")
# 對y進行操作
if x_y_work == 1:
# 獲取當前座標
snake_node = [source_x, source_y]
# 嘗試移除座標
sign = remove_atom(x_y_list, snake_node, result_list)
# 正常刪除
if sign == 0:
if add_or_cut[1] == 0:
source_y += 1
elif add_or_cut[1] == 1:
source_y -= 1
else:
pass
pass
# 刪除失敗,倒車,轉向,走一步(但不要刪),並切換到 x
elif sign == 1:
# 倒車
if add_or_cut[1] == 0:
source_y -= 1
elif add_or_cut[1] == 1:
source_y += 1
# 判斷x當前的狀態,確定轉向方向
# 如果x為零,說明下一步要增加了
if add_or_cut[0] == 0:
source_x += 1
elif add_or_cut[0] == 1:
source_x -= 1
else:
print("照理說,不應該到這裡")
# 處理好自己的後事(確定下一步的_加或減的_方向)
if add_or_cut[1] == 0:
add_or_cut[1] = 1
elif add_or_cut[1] == 1:
add_or_cut[1] = 0
print("切換引擎前的點為:", [source_x, source_y])
# 正式切換引擎
x_y_work = 0
else:
print("照理說,不應該到這裡")
pass
# 再對x進行操作
elif x_y_work == 0:
# 獲取當前座標
snake_node = [source_x, source_y]
# 嘗試移除座標
sign = remove_atom(x_y_list, snake_node, result_list)
# 正常刪除
if sign == 0:
if add_or_cut[0] == 0:
source_x += 1
elif add_or_cut[0] == 1:
source_x -= 1
else:
pass
pass
# 刪除失敗,倒車,轉向,走一步(但不要刪),並切換到 x
elif sign == 1:
# 倒車
if add_or_cut[0] == 0:
source_x -= 1
elif add_or_cut[0] == 1:
source_x += 1
# 判斷y當前的狀態,確定轉向方向
# 如果y指向為零,說明下一步要增加了
if add_or_cut[1] == 0:
source_y += 1
elif add_or_cut[1] == 1:
source_y -= 1
else:
print("禁區")
pass
# 處理好自己的後事(確定下一步的_加或減的_方向)
if add_or_cut[0] == 0:
add_or_cut[0] = 1
elif add_or_cut[0] == 1:
add_or_cut[0] = 0
# 正式切換引擎
x_y_work = 1
else:
print("照理說,不應該到這裡")
pass
result_list = l_to_num(n, result_list)
print("在二維座標系中,走過的路徑為:")
print(result_list)
print("實際走過的位置座標為:")
for m in range(n):
for n in range(n):
print(result_list[m*n+n],end=",")
print("")
if __name__ == '__main__':
main()
原始資料
執行結果
演算法 蛇形矩陣輸出
思路 1.建立n n的二維陣列。2.定義四個填充的方法,分別是 3.當需要填充時,確定方向,然後從外向內遍歷找到空缺的位置進行填充。var print function n var type 1,typecount 4 var func getfunc type for var i 1 i n n ...
螺旋矩陣 蛇形矩陣
問題描述 給定乙個包含m行n列的m x n矩陣,程式設計按照螺旋順序,輸出該矩陣中的所有元素。輸入有多個矩陣。每個矩陣資料的第1行有兩個整數m和n,接著是乙個mxn矩陣的描述,有m行,每行有n個整數 輸出對每個矩陣資料,按照螺旋順序輸出矩陣陣列的元素。輸入樣例 3 31 2 3 4 5 6 7 8 ...
C語言演算法(1) 蛇形矩陣
題目來自 c語言網 題目描述 蛇形矩陣是由1開始的自然數依次排列成的乙個矩陣上三角形。輸入本題有多組資料,每組資料由乙個正整數n組成。n不大於100 輸出對於每一組資料,輸出乙個n行的蛇形矩陣。兩組輸出之間不要額外的空行。矩陣三角中同一行的數字用乙個空格分開。行尾不要多餘的空格。樣例輸入 5 樣例輸...