带有数组的Php棋盘螺旋显示

带有数组的Php棋盘螺旋显示,php,Php,因此,我正在研究如何制作一个棋盘,但其中有一个螺旋,而不是像这样制作的默认棋盘: $checkerboard=array(); for($row=0;$row<10;$row++){ if($row%2==0){ for($col=0;$col<10;$col++){ if($col%2==0){ $checkerboard[$row][$col]="white"; }el

因此,我正在研究如何制作一个棋盘,但其中有一个螺旋,而不是像这样制作的默认棋盘:

$checkerboard=array();
    for($row=0;$row<10;$row++){
    if($row%2==0){
        for($col=0;$col<10;$col++){
            if($col%2==0){
                $checkerboard[$row][$col]="white";
            }else{
                $checkerboard[$row][$col]="black";
            }
        }
    }else{
        for($col=0;$col<10;$col++){
            if($col%2==0){
                $checkerboard[$row][$col]="black";
            }else{
                $checkerboard[$row][$col]="white";
            }
        }
    }
}
$diagonal=array();
    for($row=0;$row<10;$row++){
        for($col=0;$col<10;$col++){
            if($row==$col){
                $diagonal[$row][$col]='black';
            }else{
                $diagonal[$row][$col]='white';
            }
            if($row+$col==9){
                $diagonal[$row][$col]='black';
            }
        }
    }
echo "<table>";
for($row=0;$row<count($checkerboard);$row++){
    echo "<tr>";
        for($col=0;$col<count($checkerboard);$col++){
            echo "<td width='50px' height='50px' bgcolor='".$checkerboard[$row][$col]."'></td>";
        }
    echo "</tr>";
}
$checkboard=array();
对于($row=0;$row请尝试以下方法:

我创建了一个空板,然后开始绘制水平线和垂直线,每次都从边缘开始。代码可能需要一些调整,但这是一个好的开始

$checkerboard=array();

$size = 12;

for ($row=0; $row<$size; $row++) {
    for ($col=0; $col<$size; $col++) {
        $checkerboard[$row][$col]="red";
    }
}

//horizontal
$pair = 0 ;
while ($pair < (int) $size / 2) {
    //drawing top half rows
    $row = 2 * $pair;
    $end = min($row, $size - $row);
    $start = $end - 2;
    for ($col = $start; ($col < $size - $end) && ($row < $size / 2); $col++){
        $checkerboard[$row][$col]="black";
    }
    //drawing bottom half rows
    $far_row = $size - 1 - 2 * $pair;
    $end = min($far_row, $size - $far_row) + 1 - 2;
    $start = $end ;
    for ($col = $start; ($col < $size - $end) && ($far_row > $size / 2 ); $col++){
        $checkerboard[$far_row][$col]="black";
    }
    $pair++;
}

$pair = 0;
//vertical
while ($pair < (int) $size / 2)  {
    //drawing left half columns
    $col = 2 * $pair;
    $end = min($col, $size - $col);
    $start = $end +2 ;
    for ($row = $start; ($row < $size - $end) && ($col < $size / 2); $row++){
        $checkerboard[$row][$col]="black";
    }
    //drawing right half columns
    $far_columns = $size - 1 - 2 * $pair;
    $end = min($far_columns, $size - $far_columns) - 1;
    $start = $end ;
    for ($row = $start; ($row < $size - $end) && ($far_columns  >= ($size / 2 ) ); $row++){
        $checkerboard[$row][$far_columns]="black";
    }
    $pair++;
}


echo "<table>";
for($row=0;$row< $size;$row++){
    echo "<tr>";
        for($col=0; $col< $size; $col++){
            echo "<td width='50px' height='50px' bgcolor='".$checkerboard[$row][$col]."'></td>";
        }
    echo "</tr>";
}
$checkboard=array();
$size=12;
对于($row=0;$row=($size/2));$row++){
$checkboard[$row][$far\u columns]=“黑色”;
}
$pair++;
}
回声“;
对于($row=0;$row<$size;$row++){
回声“;
对于($col=0;$col<$size;$col++){
回声“;
}
回声“;
}

您只需更改不同维度的
$size
变量

以下是我对该问题的尝试:

function buildSpiral($gridSize)
{
    /**
     * Origin is at the top left handcorner
     */
    $x = 0;
    $y = 0;
    $xMin = 0;
    $xMax = $gridSize-1;
    $yMin = 2;
    $yMax = $gridSize-1;
    $pattern = [];
    $size = $gridSize;

    $collision = function($p, $limit) {
        return (bool) ($p == $limit);
    };

    // increment x
    $shadeRight = function(&$x, $y) use (&$pattern, &$xMin, &$xMax, $collision) {
        if ($xMin > $xMax) {
            return;     
        }
        do {
            $pattern[$y][$x] = 1;
        } while (!$collision($x++, $xMax));
        if ($x >= $xMax) {
            $x=$xMax;
        }
        $xMax-=2;
    };

    // increment y
    $shadeDown = function($x, &$y) use (&$pattern, &$yMin, &$yMax, $collision) {
        while ($y < $yMax && $yMin > $yMax) {
            $pattern[++$y][$x] = 1;
        }
        if ($yMin > $yMax) {
            return;
        }

        do {
            $pattern[$y][$x] = 1;
        } while (!$collision($y++, $yMax));
        if ($y >= $yMax) {
            $y = $yMax;
        }
        $yMax-=2;
    };

    // decrement x
    $shadeLeft = function(&$x, $y) use (&$pattern, &$xMin, &$xMax, $collision, $gridSize) {
        if ($xMin > $xMax) {
            return;
        }
        do {
            $pattern[$y][$x] = 1;
        } while (!$collision($x--, $xMin));
        if ($x < $xMin) {
            $x=$xMin;
        }
        $xMin+=2;
    };

    // decrement y
    $shadeUp = function($x, &$y) use (&$pattern, &$yMin, &$yMax, $collision, $gridSize) {
        while ($y > $yMin && $yMin > $yMax) {
            $pattern[--$y][$x] = 1;
        }

        if ($yMin > $yMax) {
            return;
        }
        do {
            $pattern[$y][$x] = 1;
        } while(!$collision(--$y, $yMin));
        if ($y < $yMin) {
            $y = $yMin;
        }

        $yMin+=2;
    };

    while ($size > 0) {
        $shadeRight($x, $y);
        $shadeDown($x, $y);
        $shadeLeft($x, $y);
        $shadeUp($x, $y);

        $size-=2;
    }

    return $pattern;    
}

for ($i = 1; $i <= 25; $i++) {
    $checkboard = buildSpiral($i);
    echo  "<h1>$i</h1>";
    echo "<table style='margin-bottom: 2em;'>";
    for($row=0;$row<count($checkboard);$row++){
        echo "<tr>";
            for($col=0;$col<count($checkboard);$col++){
                if (!isset($checkboard[$row][$col])) {
                    echo "<td width='50px' height='50px' bgcolor=\"red\"></td>";
                } else {
                    echo "<td width='50px' height='50px' bgcolor=\"black\"></td>";
                }
            }
        echo "</tr>";
    }
    echo "</table>";
}
函数构建螺旋($gridSize)
{
/**
*原点在左上角
*/
$x=0;
$y=0;
$xMin=0;
$xMax=$gridSize-1;
$yMin=2;
$yMax=$gridSize-1;
$pattern=[];
$size=$gridSize;
$collision=函数($p$limit){
回报率(bool)($p==$limit);
};
//增量x
$shaderRight=函数(&$x,$y)使用(&$pattern,&$xMin,&$xMax,$collision){
如果($xMin>$xMax){
返回;
}
做{
$pattern[$y][$x]=1;
}而(!$collision($x++,$xMax));
如果($x>=$xMax){
$x=$xMax;
}
$xMax-=2;
};
//增量y
$shadeDown=函数($x,&$y)使用(&$pattern,&$yMin,&$yMax,&$collision){
而($y<$yMax&$yMin>$yMax){
$pattern[+$y][$x]=1;
}
如果($yMin>$yMax){
返回;
}
做{
$pattern[$y][$x]=1;
}而(!$collision($y++,$yMax));
如果($y>=$yMax){
$y=$yMax;
}
$yMax-=2;
};
//减量x
$shadeLeft=函数(&$x,$y)使用(&$pattern,&$xMin,&$xMax,$collision,$gridSize){
如果($xMin>$xMax){
返回;
}
做{
$pattern[$y][$x]=1;
}而(!$collision($x--,$xMin));
如果($x<$xMin){
$x=$xMin;
}
$xMin+=2;
};
//减量
$shadeUp=函数($x,&$y)使用(&$pattern,&$yMin,&$yMax,$collision,$gridSize){
而($y>$yMin&$yMin>$yMax){
$pattern[--$y][$x]=1;
}
如果($yMin>$yMax){
返回;
}
做{
$pattern[$y][$x]=1;
}而(!$collision(-$y,$yMin));
如果($y<$yMin){
$y=$yMin;
}
$yMin+=2;
};
而($size>0){
$shaderlight($x,$y);
$shadeDown($x,$y);
$shadeLeft($x,$y);
$shadeUp($x,$y);
$size-=2;
}
返回$模式;
}

对于($i=1;$i您自己是否已经尝试过创建圆?您能展示一下您已经尝试过的代码吗?您是指螺旋?还是圆?很好,但前面的答案同样好,而且更紧凑,即使您使用的是函数。在我的尝试中,我试图想出一个可以用于不同方向的解决方案,我将我会更新我的解决方案,让你明白我的意思——看看你是否能想出如何让它们从剩余的角落开始。如果你真的想学习,试着剖析321zeno的代码,并尝试重新创建或重写它。他使用了一些很好的步骤,使其易懂且简单。
function buildSpiral($gridSize)
{
    /**
     * Origin is at the top left handcorner
     */
    $x = 0;
    $y = 0;
    $xMin = 0;
    $xMax = $gridSize-1;
    $yMin = 2;
    $yMax = $gridSize-1;
    $pattern = [];
    $size = $gridSize;

    $collision = function($p, $limit) {
        return (bool) ($p == $limit);
    };

    // increment x
    $shadeRight = function(&$x, $y) use (&$pattern, &$xMin, &$xMax, $collision) {
        if ($xMin > $xMax) {
            return;     
        }
        do {
            $pattern[$y][$x] = 1;
        } while (!$collision($x++, $xMax));
        if ($x >= $xMax) {
            $x=$xMax;
        }
        $xMax-=2;
    };

    // increment y
    $shadeDown = function($x, &$y) use (&$pattern, &$yMin, &$yMax, $collision) {
        while ($y < $yMax && $yMin > $yMax) {
            $pattern[++$y][$x] = 1;
        }
        if ($yMin > $yMax) {
            return;
        }

        do {
            $pattern[$y][$x] = 1;
        } while (!$collision($y++, $yMax));
        if ($y >= $yMax) {
            $y = $yMax;
        }
        $yMax-=2;
    };

    // decrement x
    $shadeLeft = function(&$x, $y) use (&$pattern, &$xMin, &$xMax, $collision, $gridSize) {
        if ($xMin > $xMax) {
            return;
        }
        do {
            $pattern[$y][$x] = 1;
        } while (!$collision($x--, $xMin));
        if ($x < $xMin) {
            $x=$xMin;
        }
        $xMin+=2;
    };

    // decrement y
    $shadeUp = function($x, &$y) use (&$pattern, &$yMin, &$yMax, $collision, $gridSize) {
        while ($y > $yMin && $yMin > $yMax) {
            $pattern[--$y][$x] = 1;
        }

        if ($yMin > $yMax) {
            return;
        }
        do {
            $pattern[$y][$x] = 1;
        } while(!$collision(--$y, $yMin));
        if ($y < $yMin) {
            $y = $yMin;
        }

        $yMin+=2;
    };

    while ($size > 0) {
        $shadeRight($x, $y);
        $shadeDown($x, $y);
        $shadeLeft($x, $y);
        $shadeUp($x, $y);

        $size-=2;
    }

    return $pattern;    
}

for ($i = 1; $i <= 25; $i++) {
    $checkboard = buildSpiral($i);
    echo  "<h1>$i</h1>";
    echo "<table style='margin-bottom: 2em;'>";
    for($row=0;$row<count($checkboard);$row++){
        echo "<tr>";
            for($col=0;$col<count($checkboard);$col++){
                if (!isset($checkboard[$row][$col])) {
                    echo "<td width='50px' height='50px' bgcolor=\"red\"></td>";
                } else {
                    echo "<td width='50px' height='50px' bgcolor=\"black\"></td>";
                }
            }
        echo "</tr>";
    }
    echo "</table>";
}
function buildSpiral($gridSize)
{
    /**
     * Origin is at the top left handcorner
     */
    $x = $gridSize-1;
    $y = 0;
    $xMin = 0;
    $xMax = $gridSize-1;
    $yMin = 2;
    $yMax = $gridSize-1;
    $pattern = [];
    $size = $gridSize;

    $collision = function($p, $limit) {
        return (bool) ($p == $limit);
    };

    // increment x
    $shadeRight = function(&$x, $y) use (&$pattern, &$xMin, &$xMax, $collision) {
        if ($xMin > $xMax) {
            return;     
        }
        do {
            $pattern[$y][$x] = 1;
        } while (!$collision($x++, $xMax));
        if ($x >= $xMax) {
            $x=$xMax;
        }
        $xMax-=2;
    };

    // increment y
    $shadeDown = function($x, &$y) use (&$pattern, &$yMin, &$yMax, $collision) {
        while ($y < $yMax && $yMin > $yMax) {
            $pattern[++$y][$x] = 1;
        }
        if ($yMin > $yMax) {
            return;
        }

        do {
            $pattern[$y][$x] = 1;
        } while (!$collision($y++, $yMax));
        if ($y >= $yMax) {
            $y = $yMax;
        }
        $yMax-=2;
    };

    // decrement x
    $shadeLeft = function(&$x, $y) use (&$pattern, &$xMin, &$xMax, $collision, $gridSize) {
        if ($xMin > $xMax) {
            return;
        }
        do {
            $pattern[$y][$x] = 1;
        } while (!$collision($x--, $xMin));
        if ($x < $xMin) {
            $x=$xMin;
        }
        $xMin+=2;
    };

    // decrement y
    $shadeUp = function($x, &$y) use (&$pattern, &$yMin, &$yMax, $collision, $gridSize) {
        while ($y > $yMin && $yMin > $yMax) {
            $pattern[--$y][$x] = 1;
        }

        if ($yMin > $yMax) {
            return;
        }
        do {
            $pattern[$y][$x] = 1;
        } while(!$collision(--$y, $yMin));
        if ($y < $yMin) {
            $y = $yMin;
        }

        $yMin+=2;
    };

    while ($size > 0) {
        $shadeLeft($x, $y);
        $shadeDown($x, $y);
        $shadeRight($x, $y);
        $shadeUp($x, $y);

        $size-=2;
    }

    return $pattern;    
}

for ($i = 1; $i <= 25; $i++) {
    $checkboard = buildSpiral($i);
    echo  "<h1>$i</h1>";
    echo "<table style='margin-bottom: 2em;'>";
    for($row=0;$row<count($checkboard);$row++){
        echo "<tr>";
            for($col=0;$col<count($checkboard);$col++){
                if (!isset($checkboard[$row][$col])) {
                    echo "<td width='50px' height='50px' bgcolor=\"red\"></td>";
                } else {
                    echo "<td width='50px' height='50px' bgcolor=\"black\"></td>";
                }
            }
        echo "</tr>";
    }
    echo "</table>";
}