Python/PHP數字螺旋矩陣的程式碼

來源:互聯網
上載者:User
什麼是螺旋矩陣?螺旋矩陣是指一個呈螺旋狀的矩陣,它的數字由第一行開始到右邊不斷變大,向下變大,向左變大,向上變大,如此迴圈。下圖就是一個螺旋矩陣的樣本:鄭曉在這裡分別使用了Python和PHP來實現了數位螺旋矩陣。其中的PHP版本寫成了函數,更加靈活的對矩陣進行控制。寫Python時由於是第一次寫,有些生疏,分別用了兩種方法來實現。。。下面上代碼吧:Python螺旋矩陣的第一版(比較難以理解?!):#coding:gbkL = 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 :                breakfor R in result:        for c in R:                print "%3d" % (c) ,        printraw_input()


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

#coding:gbkimport 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";


下面是依次的運行結果:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.