《演算法》蛇形矩陣求解

2021-09-20 04:37:20 字數 3879 閱讀 7352

蛇形矩陣

右下,下左,左上,上右,迴圈往復~

如果每次迴圈都計算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 樣例輸...