回型环绕打印,php版

marlons 2011-08-07 11:44:10
http://blog.csdn.net/marlons/article/details/6666973
...全文
121 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
marlons 2011-08-09
  • 打赏
  • 举报
回复

if(++$i == $n-1) {
$i = $m;
array_unshift($d, array_pop($d));
$dx = $d[0] - $d[2];
$dy = $d[1] - $d[3];
if($d[0]) {
$m++;
$n--;
$i = $x = $y = $m;
}
}

不服不行了,这一个if,亮的刺眼呀。O(∩_∩)O~。
xuzuning 2011-08-09
  • 打赏
  • 举报
回复
ideas思路不错,按此思路
function Circle($n) {
$k = $n % 2;
$ar = array();
for($i=0; $i<$n; $i++)
$ar[$i] = array_fill(0, $n, 0);
$p = $m = $i = 0;
$x = $y = 0;
$dx = 1;
$dy = 0;
$d = array(1, 0, 0, 0);
$len = $n * $n;
while($p < $len) {
$ar[$y][$x] = ++$p;
$x += $dx;
$y += $dy;
if(++$i == $n-1) {
$i = $m;
array_unshift($d, array_pop($d));
$dx = $d[0] - $d[2];
$dy = $d[1] - $d[3];
if($d[0]) {
$m++;
$n--;
$i = $x = $y = $m;
}
}
}

$r = '<table>';
foreach($ar as $v)
$r .= '<tr><td>' . join('</td><td>', $v) . '</td></tr>';
return $r.'</table>';
}
码无边 2011-08-09
  • 打赏
  • 举报
回复
据说回帖可以加分!
sports98 2011-08-09
  • 打赏
  • 举报
回复
戴墨镜飘过
xuzuning 2011-08-08
  • 打赏
  • 举报
回复
用一个函数就可以了
function Circle($n) {
$ar = array();
for($i=0; $i<$n; $i++)
$ar[$i] = array_fill(0, $n, 0);
$p = 1;
$x = 0;
$y = 0;
$dx = 1;
$dy = 0;
$len = $n * $n;
while($len--) {
$ar[$y][$x] = $p++;
while(1) {
if($dx && $ar[$y][$x + $dx] > 0) {$dy = $dx; $dx = 0; break; }
if($dy && $ar[$y+$dy][$x] > 0) { $dx = -$dy; $dy = 0; break; }
if($x + $dx == $n) { $dy = 1; $dx = 0; break; }
if($x + $dx < 0) { $dx = 0; $dy = -1; break; }
if($y + $dy == $n) { $dy = 0; $dx = -1; break; }
if($y + $dy < 0) { $dy = 0; $dx = 1; break; }
break;
}
$x += $dx;
$y += $dy;
}

$r = '<table>';
foreach($ar as $v)
$r .= '<tr><td>' . join('</td><td>', $v) . '</td></tr>';
return $r.'</table>';
}
for($i=1;$i<30;$i++){
$html .= Circle( $i );
$html .='<hr>';
}
?>
<html>
<head>
<style>
ul li {
float: left;
width: 40px;
height: 40px;
}
hr{clear:both;}
</style>
</head>
<body>
<?php
echo $html?>
</body>
</html>
marlons 2011-08-08
  • 打赏
  • 举报
回复
呵呵,我说过我之前写过一次,用的就是你这种思路,代码实现当然没有你这么简洁。- -!技巧不精啊。
类似碰撞原理,最外围有一堵墙,然后在墙内开始修墙一样。
预先计算下一步,如果出了最大范围则转向

if($x + $dx == $n) { $dy = 1; $dx = 0; break; }
if($x + $dx < 0) { $dx = 0; $dy = -1; break; }
if($y + $dy == $n) { $dy = 0; $dx = -1; break; }
if($y + $dy < 0) { $dy = 0; $dx = 1; break; }

另外加一个条件则是,

if($dx && $ar[$y][$x + $dx] > 0) {$dy = $dx; $dx = 0; break; }
if($dy && $ar[$y+$dy][$x] > 0) { $dx = -$dy; $dy = 0; break; }

如果允许的范围内已经有了填充的操作则转向。

我这一次写得思路是这样的。
行数为 $n时,总转向次数其实是 $n*2-1,
每一步的步数是, $n,$n-1,$n-1,$n-2,$n-2,....,2,2,1,1。
如此一来,就不在进行下一步的预判。
而是直接按照预设好得,每次的最大步数,填充,也就是map_max的保存的数组。
走完的时候正好就是你判断转向的节点。

21,890

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧