我必须找到一个php代码来解决一个数学问题。
以下是问题描述:
玩家A和B正在玩一种新的石头游戏。有N的石头放置在地面上,形成了一个序列。这些石头被标记为从1到N的。玩家A和B轮流在地面上取两块连续的石头,直到地面上没有连续的石头。也就是说,每个玩家可以拿石头i和石头i+1,其中1≤i≤N−1。如果剩余的石块数为奇数,则A获胜。否则,B获胜。假设A和B都打得最好,A先打,你知道谁是赢家吗?
这条线有N个,索引从1到N --> N (1≤N≤10 000 000)
如果剩余的石块数为奇数,则A获胜。否则,B获胜。
这是我的代码。它确实起作用了,但它并不正确。
<?php
$nStones = rand(1, 10000000);
$string = ("i");
$start = rand(1, 10000000);
$length = 2;
while($nStones > 0) {
substr( $nStones , $start [, $length ]): string;
}
if ($nStones % 2 == 1) {
echo "A";
} else {
echo "B";
}
?>
我想我错过了A和B交替减去两个连续的石头,而$nStones > 0。此外,问题描述提到了最优减法,直到只剩下一块石头。因此,我猜测这些石块一起移动到它们最近的石块上(缝隙消失,并被最近的石块取代)。
发布于 2018-06-10 00:22:19
我在这里做了一个开始:
<?php
class GameOfStones
{
const STONE_PAIR = 'OO';
const GAP_PAIR = '__';
public $line;
public function __construct($length)
{
$this->line = str_pad('', $length, self::STONE_PAIR);
}
// Removes a pair of stones from the line at nth location.
public function remove($n)
{
if(substr($this->line, $n-1, 2) == self::STONE_PAIR)
$this->line =
substr_replace($this->line, self::GAP_PAIR , $n-1, 2);
else
throw new Exception('Invalid move.');
}
// Check if there are no further possible moves.
public function is_finished()
{
return strpos($this->line, self::STONE_PAIR) === false;
}
// Representation of line.
public function __toString()
{
return implode('.', str_split($this->line)) ."\n";
}
};
$game = new GameOfStones(6);
echo $game;
var_dump($game->is_finished());
$game->remove(5);
echo $game;
var_dump($game->is_finished());
$game->remove(2);
echo $game;
var_dump($game->is_finished());
输出:
O.O.O.O.O.O
bool(false)
O.O.O.O._._
bool(false)
O._._.O._._
bool(true)
目前,这个类从创建一行开始,该行是一个'O‘字符的字符串。
因此,如果长度为5,则行将是这样的字符串:
OOOOO
remove方法接受一个索引。如果索引是1,那么首先在字符串0索引( n-1)处检查两个连续的O。换句话说,“在给定的位置有要移除的石头吗?”如果有石块,我们在该位置进行字符串替换,并将两个O替换为两个_s。
is_finished方法检查行中第一次出现两个O的情况。换句话说,如果有两个连续的棋子,那么仍然有一步棋要走。
魔术方法__toString是GameOfStones对象的字符串表示形式。这是一种可视化游戏状态的方法。
O.O.O.O._._
上面显示了四块石头和两个空格(我不确定点分隔符是否必要-下划线可能会互相渗入,这就是我使用它们的原因)。
我已经添加了代码的示例使用,其中从一行六个石块中删除(两个)对石块。在每次删除之后,我们检查是否有另一个可能的移动,或者更确切地说,游戏是否已经结束。
目前还没有球员归属,这留给你了。
你的最后一条规则:
‘如果剩下的石头数是奇数,A赢,否则B赢。’
我正在苦苦挣扎。请参阅以下示例:
i) Line of length 3:
OOO
O__ A (1)
End: one (odd) stone left.
ii) Line of length 4:
OOOO
OO__ A (3)
____ B (1)
End: zero (even) stones left.
ii) Line of length 7:
OOOOOOO
O__OOOO A(1)
O__O__O B(5)
End: three (odd) stones left.
我要说的是,谁移除了这对组合,下一个玩家就不能去了,谁就是赢家。在上面的游戏ii)中,如果A在位置1 (O__O
)比赛,那么他们将阻止B比赛。
https://stackoverflow.com/questions/50775556
复制相似问题