1. 程式人生 > >Python/PHP數字螺旋矩陣

Python/PHP數字螺旋矩陣

注:本文為轉載,如有侵權請告知,將予以刪除

原連結:https://www.zh30.com/php-python-shuzi-luoxuan-juzhen.html

 

什麼是螺旋矩陣?
螺旋矩陣是指一個呈螺旋狀的矩陣,它的數字由第一行開始到右邊不斷變大,向下變大,向左變大,向上變大,如此迴圈。下圖就是一個螺旋矩陣的示例:
數字螺旋矩陣

鄭曉在這裡分別使用了Python和PHP來實現了數字的螺旋矩陣。其中的PHP版本寫成了函式,更加靈活的對矩陣進行控制。寫Python時由於是第一次寫,有些生疏,分別用了兩種方法來實現。。。下面上程式碼吧:
Python螺旋矩陣的第一版(比較難以理解–!):

#coding:gbk
L = 6 #矩陣大小
result = [[0]*L for n in range(L)]
row =0   #初始行   從左上角開始
col = 0  #初始列   從左上角開始
value = 1#初始值
direction = 'r' #初始方向 向右
circle = 1 #初始圈數 第一圈
while True:
        #向右走
        if direction == 'r':
                result[row][col] = value
                if col>=L-circle:
                        direction = 'd'
                        continue
                col += 1
        #向下走
        if direction =='d':
                result[row][col] = value
                if row >= L-circle:
                        direction = 'l'
                        continue
                row += 1
        #向左走
        if direction == 'l':
                result[row][col] = value
                if col <= circle -1:
                        direction = 'u'
                        continue
                col -= 1
        #向上走
        if direction == 'u':
                result[row][col] = value
                if row-1 <= circle:
                        direction = 'r'
                        circle += 1
                        #continue
                row -= 1
        value += 1
        if value > L * L :
                break
for R in result:
        for c in R:
                print "%3d" % (c) ,
        print
raw_input()

接下來是Python螺旋矩陣的第二版,其中使用了迭代器控制方向,程式碼量明顯減少,而且更容易理解了。多次使用不同的起點生成的矩陣時,你會發現有個地方寫的有點兒“問題”,找到問題了沒有?

#coding:gbk
import itertools

#引數:矩陣寬(w)、高(h)、起始橫座標、起始縱座標
def print_matrix(w, h, x = 0, y = 0):
    #方向移動時的操作
    op = [(1,0), (-1,0), (0,-1), (0,1)]
    #迭代器可無限迭代列表 每次要換方向時就next()
    direction = itertools.cycle(op)
    #根據行列生成所有座標
    result = {(xx,yy):None for xx in range(w) for yy in range(h)}
    result[(x,y)] = 1
    _x, _y = direction.next()
    i = 1
    flag = 0 
    while True:
            new_x = x + _x
            new_y = y + _y
            if (new_x, new_y) in result and result[(new_x, new_y)] is None:
                i = i + 1
                result[(new_x, new_y)] = i
                x = new_x
                y = new_y
                flag = 0
            else:
                _x, _y = direction.next()
                flag = flag + 1
            if flag>4: break
    #列印結果
    for y in range(h):
        for x in range(w):
            print "%3d" % (result[(x,y)]),
        print

#呼叫示例
print_matrix(6,6,5,0)
raw_input()

下面是PHP版的螺旋矩陣,思路和上面的Python是一樣的(其實我是照著寫的…)。

/* *
 * @param $w : 寬
 * @param $h : 高
 * @param $s : 起始數字
 * @param $x, $y : 起始位置座標 只能從四頂點開始
 * @param $r :方向 預設順時間 false為逆時針
 * @author : 鄭曉
 * php5.6.11
 * 這是一個螺旋矩陣的PHP版本,由於之前在python下寫過,有了一些經驗,所以在php中也使用了SPL的一個迭代器,用於換向。演算法編寫時是使用的過程式,後來又改為了函式,加入了一些自定義引數,方便呼叫(然並卵)。輸出中使用的是製表和換行符,請在瀏覽器原始碼中檢視執行結果。
 */

function print_matrix($w, $h, $s=1, $l=1, $x=0, $y=0, $r=true) {
    $R = array(array(1,0), array(0,1), array(-1,0), array(0,-1));
    !$r && $R = array_reverse($R);
    $iterator = new InfiniteIterator(new ArrayIterator($R)); //建立一個無限迭代器
    $iterator->rewind(); //指標指向第一元素
    list($_x, $_y) = $iterator->current();

    $result = [];
    $result[$x][$y] = $s;
    for($i = $s+1; $i < $s+$w * $h; $i++) {
        $new_x = $x + $_x;
        $new_y = $y + $_y;
        
        if(0<= $new_x && 0<= $new_y && $new_x < $w && $new_y < $h && !isset($result[$new_x][$new_y])) {
            $result[$new_x][$new_y] = $i;
            $x = $new_x;
            $y = $new_y;
        } else {
            $iterator->next();
            list($_x, $_y) = $iterator->current();
            $i--;
        }

    }
    //以下是列印矩陣結構
    for($i=0; $i< $h; $i++) {
        for($j=0; $j< $w; $j++) {
            echo $result[$j][$i], "\t";
        }
        echo "\n";
    }
}

//呼叫示例測試
print_matrix(5, 5); echo "\n";
print_matrix(7, 4); echo "\n";
print_matrix(5, 5, 1, 4, 0); echo "\n";
print_matrix(5, 5, 10, 0, 4, false); echo "\n";

下面是依次的執行結果:
python螺旋矩陣

python螺旋矩陣

php螺旋矩陣