Помогите поправить работу кода PHP
Доброго времени суток.
У меня есть задача ( уровень наверное школа - техникум, что то вроде того).
Заключается в следующем.
В $_POST["FatalErrors"] и $_POST["Warnings"] пользователь задаёт 2 числа, которые должны обработаться так:
Если из F вычитается 1, то прибавляется 1 к F
Если из W вычитается 1, то прибавляется 2 к W
Если из W вычитается 2, то прибавляется 1 к F
Если из F вычитается 2, то ничего не происходит, просто вычитается эти 2.
То есть алгоритм в итоге должен либо сделать числа равными нулю и показать количество итераций, либо выдать невозможность приведения к нулю этих чисел.
Я имею следующий код:
$FatalErrors = $_POST["FatalErrors"];
$Warnings = $_POST["Warnings"];
$i = 0;
while($FatalErrors != 0 OR $Warnings != 0){
if ($FatalErrors >= 2) {
$FatalErrors -= 2;
$i++;
};
if ($Warnings >= 2){
$Warnings -= 2;
$FatalErrors += 1;
$i++;
};
if ($Warnings == 1) {
$Warnings += 1;
$i++;
};
if ($FatalErrors == 1 && $Warnings == 0 ){
echo ("-1");
break;
}
};
echo "<br>";
echo $i;
echo "<br>";
echo $FatalErrors . "итог F(N)";
echo $Warnings . "итог W(M)";
И вроде как всё работает, НО есть числа, которые должны работать с задачей, а у меня не работают, в пример мне дали F = 987 W = 100, в итоге должно выдать нули и число итераций в виде 572, так как это решабельная вариация чисел, а вот мой код пишет - "Невозможно", да и просто числа F = 3 W = 3 должно тоже решаться с 9 итераций, но я видимо что-то упускаю.
Как это решить - так и не понял, может кто-то подскажет или не замыленным взглядом, видна какая то ошибка относительно задачи, а я просто её пропускаю.
Заранее спасибо.
P/S
Собственно само задание
У программиста есть код на PHP. У него было N фатальных ошибок и M
ворнингов. Он решил заставить код работать без ошибок и ворнингов. Он не очень опытный
разработчик. Если он исправляет одну фатальную ошибку за коммит, то вместо неё
появляется одна новая, если исправляет ворнинг в коммите, то вместо него
появляется два новых ворнинга. Если он исправляет два ворнинга за один коммит,
то появляется одна новая фатальная ошибка, и только когда он исправляет сразу
две фатальные ошибки за один коммит, то не появляется ничего нового. Он считает,
что код будет полностью рабочим только если исправить все фатальные ошибки и
ворнинги.
Определи минимальное количество коммитов, нужное для исправления всех багов.
Напиши php-скрипт, который определит минимальное количество коммитов,
необходимых для исправления кода.
Входные данные
В форму на странице можно ввести два числа N, M (0 ≤ N, M ≤ 1000).
Выходные данные
Нужно вывести одно число – минимальное количество коммитов, или -1, если
исправить код Пети невозможно.
Пример входных данных:
3 3
Пример выходных данных:
9
Ответы (2 шт):
Так ?
$FatalErrors = 3;
$Warnings = 3;
$i = 0;
while(true)
{
if ($FatalErrors >= 2) $FatalErrors -= 2;
elseif ($FatalErrors == 1) $FatalErrors +=1;
if ($Warnings >= 2) $Warnings -= 2;
elseif ($Warnings == 1) $Warnings += 1;
if ($FatalErrors == 0 && $Warnings == 0 ){
echo ("Возможно. Число итераций - ".$i);
break;
}
$i++;
}
Я не знаю насчет оптимальности, но мне в голову пока пришел такой алгоритм:
- Уничтожить все варнинги так, чтобы фатальных осталось четное число.
- Уничтожить все фатальные по 2.
Вообще, возможно я не до конца понимаю условие. При такой постановке задачи любая комбинация ошибок будет решаемая. Ведь варнингами можно подстроить и количество варнингов, и количество фатальных.
Вот такой получился код:
<?php
$f = 987; $w = 100; $i = 0;
// шаг 1: приведем количество варнингов к четному числу
if ($w % 2 !== 0) {
fix('w', 1, $f, $w, $i);
}
// шаг 2: если сумма фатальных ошибок и половины варнингов нечетная, добавим два варнинга:
// то есть сделаем так, чтобы после уничтожения всех варнингов число фатальных ошибок было четное
if ((($w / 2) + $f) % 2 !== 0) {
fix('w', 1, $f, $w, $i);
fix('w', 1, $f, $w, $i);
}
// шаu 3: уничтожаем все варнинги:
while ($w > 0) {
fix('w', 2, $f, $w, $i);
}
// шаг 4 уничтожаем все фатальные ошибки.
while ($f > 0) {
fix('f', 2, $f, $w, $i);
}
echo '<p>i: ' . $i . ', F: ' . $f . ', W: ' . $w . '</p>';
// вывод:
// $f = 3; $w = 3; $i = 0;
// i: 9, F: 0, W: 0
// $f = 987; $w = 100; $i = 0;
// i: 572, F: 0, W: 0
function fix($type, $count, &$f, &$w, &$i)
{
$i++;
switch ($type . $count) {
case 'f1':
break;
case 'f2':
$f -= 2;
break;
case 'w1':
$w += 1;
break;
case 'w2':
$w -= 2;
$f += 1;
break;
}
}