當(dāng)前位置: 博客首頁(yè) >> PHP >> 閱讀正文

Python/PHP數(shù)字螺旋矩陣

作者: 鄭曉 分類: PHP, Python 發(fā)布于: 2015-08-03 22:19 瀏覽:18,013 評(píng)論(9)


什么是螺旋矩陣?
螺旋矩陣是指一個(gè)呈螺旋狀的矩陣,它的數(shù)字由第一行開始到右邊不斷變大,向下變大,向左變大,向上變大,如此循環(huán)。下圖就是一個(gè)螺旋矩陣的示例:
數(shù)字螺旋矩陣

鄭曉在這里分別使用了Python和PHP來(lái)實(shí)現(xiàn)了數(shù)字的螺旋矩陣。其中的PHP版本寫成了函數(shù),更加靈活的對(duì)矩陣進(jìn)行控制。寫Python時(shí)由于是第一次寫,有些生疏,分別用了兩種方法來(lái)實(shí)現(xiàn)。。。下面上代碼吧:
Python螺旋矩陣的第一版(比較難以理解–!):

#coding:gbk
L = 6 #矩陣大小
result = [[0]*L for n in range(L)]
row =0 #初始行 從左上角開始
col = 0 #初始列 從左上角開始
value = 1#初始值
direction = 'r' #初始方向 向右
circle = 1 #初始圈數(shù) 第一圈
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()

接下來(lái)是Python螺旋矩陣的第二版,其中使用了迭代器控制方向,代碼量明顯減少,而且更容易理解了。多次使用不同的起點(diǎn)生成的矩陣時(shí),你會(huì)發(fā)現(xiàn)有個(gè)地方寫的有點(diǎn)兒“問(wèn)題”,找到問(wèn)題了沒(méi)有?

#coding:gbk
import itertools

#參數(shù):矩陣寬(w)、高(h)、起始橫坐標(biāo)、起始縱坐標(biāo)
def print_matrix(w, h, x = 0, y = 0):
#方向移動(dòng)時(shí)的操作
op = [(1,0), (-1,0), (0,-1), (0,1)]
#迭代器可無(wú)限迭代列表 每次要換方向時(shí)就next()
direction = itertools.cycle(op)
#根據(jù)行列生成所有坐標(biāo)
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
#打印結(jié)果
for y in range(h):
for x in range(w):
print "%3d" % (result[(x,y)]),
print

#調(diào)用示例
print_matrix(6,6,5,0)
raw_input()

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

/* *
* @param $w : 寬
* @param $h : 高
* @param $s : 起始數(shù)字
* @param $x, $y : 起始位置坐標(biāo) 只能從四頂點(diǎn)開始
* @param $r :方向 默認(rèn)順時(shí)間 false為逆時(shí)針
* @author : 鄭曉
* php5.6.11
* 這是一個(gè)螺旋矩陣的PHP版本,由于之前在python下寫過(guò),有了一些經(jīng)驗(yàn),所以在php中也使用了SPL的一個(gè)迭代器,用于換向。算法編寫時(shí)是使用的過(guò)程式,后來(lái)又改為了函數(shù),加入了一些自定義參數(shù),方便調(diào)用(然并卵)。輸出中使用的是制表和換行符,請(qǐng)?jiān)跒g覽器源代碼中查看運(yùn)行結(jié)果。
*/

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)); //創(chuàng)建一個(gè)無(wú)限迭代器
$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--;
}

}
//以下是打印矩陣結(jié)構(gòu)
for($i=0; $i< $h; $i++) { for($j=0; $j< $w; $j++) { echo $result[$j][$i], "\t"; } echo "\n"; } } //調(diào)用示例測(cè)試 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";

下面是依次的運(yùn)行結(jié)果:
python螺旋矩陣

python螺旋矩陣

php螺旋矩陣

? ? ? ?

本文采用知識(shí)共享署名-非商業(yè)性使用 3.0 中國(guó)大陸許可協(xié)議進(jìn)行許可,轉(zhuǎn)載時(shí)請(qǐng)注明出處及相應(yīng)鏈接。

本文永久鏈接: http://yjfs.org.cn/php-python-shuzi-luoxuan-juzhen.html

Python/PHP數(shù)字螺旋矩陣:目前有9 條留言

用戶評(píng)論頭像 哈哈發(fā)表于 2017年04月17日 14:59[回復(fù)]

alert(‘嘿嘿’);

用戶評(píng)論頭像 先進(jìn)的羊肉發(fā)表于 2016年09月05日 18:57[回復(fù)]

php技術(shù)牛人這么多,什么時(shí)候才有我的一席之地

    用戶評(píng)論頭像 鄭曉發(fā)表于 2016年09月05日 22:37[回復(fù)]

    其實(shí)這些東西并不牛,只要理清思路寫起來(lái)是很簡(jiǎn)單的

用戶評(píng)論頭像 test發(fā)表于 2016年09月01日 21:36[回復(fù)]

alert(‘嘿嘿’);

用戶評(píng)論頭像 AdOnCn.COM發(fā)表于 2016年01月09日 16:26[回復(fù)]

很好,感謝!

用戶評(píng)論頭像 地球貓發(fā)表于 2015年11月24日 15:48[回復(fù)]

你好 發(fā)現(xiàn)你的博客網(wǎng)站非常好請(qǐng)問(wèn)可以跟你交換友情鏈接嗎?我的網(wǎng)站是
關(guān)鍵詞:免費(fèi)論壇
關(guān)鍵詞:地球貓
關(guān)鍵詞:博客主機(jī)

用戶評(píng)論頭像 日光博客發(fā)表于 2015年10月28日 16:15[回復(fù)]

博主好,想和貴博交換鏈接,可否?日光博客

用戶評(píng)論頭像 haha發(fā)表于 2015年10月01日 15:20[回復(fù)]

alert(‘呵呵’)

用戶評(píng)論頭像 麥謙生博客發(fā)表于 2015年09月23日 10:07[回復(fù)]

表示看不懂

發(fā)表評(píng)論

change vcode