螺旋式優(yōu)化算法分成內(nèi)旋和外旋,文中之內(nèi)旋為例子,如下圖
思路一:
復(fù)位二維數(shù)組,原始元素值是0從正中間挑選一個元素做為起始點1,將選定的元素先后往右邊挪動,向下移動,往左邊挪動,往上挪動,每移動到一個新元素上,就把計數(shù)器的值賦給它假如元素沒法開展第2點多的運動了,撤出挪動,打印出數(shù)組。
思路二:
復(fù)位二維數(shù)組,原始元素值是0從正中間挑選一個元素做為中心點1,以中心點為核心,以R=1為的半徑旋轉(zhuǎn),旋轉(zhuǎn)到的元素賦上計數(shù)器值,一圈旋轉(zhuǎn)進行,計數(shù)器 1,再次旋轉(zhuǎn)的半徑所去的元素超過數(shù)組范疇時,撤出。打印出數(shù)組。
思路一的源代碼:
package ** inimport ( "golang.org/x/exp/errors/fmt" "testing")const ** xX, ** xY = 9, 9func TestSpiral(t *testing.T) { x, y := 3, 3 var arr [ ** xX][ ** xY]int arr[x][y] = 1 ok := false for { arr, x, y, ok = moveRight(arr, x, y) print(t, arr) if ok { break } arr, x, y, ok = moveDown(arr, x, y) print(t, arr) if ok { break } arr, x, y, ok = moveLeft(arr, x, y) print(t, arr) if ok { break } arr, x, y, ok = moveUp(arr, x, y) print(t, arr) if ok { break } }}func moveRight(cur [ ** xX][ ** xY]int, x, y int) (newValue [ ** xX][ ** xY]int, newX, newY int, isComplete bool) { value := cur[x][y] for { y value if y <= ** xY { cur[x][y] = value } else { return cur, x, y, true } if cur[x 1][y] == 0 { return cur, x, y, false } }}func moveDown(cur [ ** xX][ ** xY]int, x, y int) (newValue [ ** xX][ ** xY]int, newX, newY int, isComplete bool) { value := cur[x][y] for { x value if x <= ** xX { cur[x][y] = value } else { return cur, x, y, true } if cur[x][y-1] == 0 { return cur, x, y, false } }}func moveLeft(cur [ ** xX][ ** xY]int, x, y int) (newValue [ ** xX][ ** xY]int, newX, newY int, isComplete bool) { value := cur[x][y] for { y-- value if y >= 0 { cur[x][y] = value } else { return cur, x, y, true } if cur[x-1][y] == 0 { return cur, x, y, false } }}func moveUp(cur [ ** xX][ ** xY]int, x, y int) (newValue [ ** xX][ ** xY]int, newX, newY int, isComplete bool) { value := cur[x][y] for { x-- value if x >= 0 { cur[x][y] = value } else { return cur, x, y, true } if cur[x][y 1] == 0 { return cur, x, y, false } }}func print(t *testing.T, cur [ ** xX][ ** xY]int) { fmt.Println("------------------") for _, v := range cur { fmt.Println(v) }}
? 2019-2025 YuTongPipe Inc. 鹽山昱通管道有限公司