У меня есть случайное целое число (6 цифр, например 568215), и я хочу сгенерировать из него действительный путь для шаблона Android.
Предположим, что:
| 1 | 2 | 3 |
| 4 | 5 | 6 |
| 7 | 8 | 9 |
Как вы знаете, например, 4-1-3-6 недействителен, потому что строка 1-3 проходит через ключ 2, который мы не можем перейти к 3, или, в другом примере, мы не можем выбрать узел дважды, поэтому в качестве примера 546512 недействителен, потому что 5 дублируется и многие другие пути, подобные этому.
Таким образом, эти пути недействительны:
(11, 22, 33, 44, 55, 66, 77, 88, 99, 13, 16, 17, 18, 19, 27, 28, 29, 34, 37, 38, 39, 46, 49, 67, 79 )
Я написал функцию, которая работает хорошо, но ее проблема в том, что я не знаю, как избежать создания дублирующихся узлов.
Here is what I've tried:
$notValidWalk = array(11, 22, 33, 44, 55, 66, 77, 88, 99, 13, 16, 17, 18, 19, 27, 28, 29, 34, 37, 38, 39, 46, 49, 67, 79);
$key = 562458;
function makeValidWalks($key, $notValidWalk)
{
$array = array_map('intval', str_split($key));
$section1 = false;
$section2 = false;
$section3 = false;
$section4 = false;
$section5 = false;
while ($section1 == false) {
if ($array[0] == 9 && $array[1] == 9) {
$array[0] = 1;
$key = $array[0] . $array[1] . $array[2] . $array[3] . $array[4] . $array[5];
$array = array_map('intval', str_split($key));
}
if ($array[0] == 0) {
$array[0] = 1;
$key = $array[0] . $array[1] . $array[2] . $array[3] . $array[4] . $array[5];
$array = array_map('intval', str_split($key));
}
if (in_array($array[0] . $array[1], $notValidWalk) || in_array($array[1] . $array[0], $notValidWalk)) {
$section1 = false;
$tmp = ($array[0] . $array[1]) + 1;
$key = $tmp . $array[2] . $array[3] . $array[4] . $array[5];
$array = array_map('intval', str_split($key));
}
if (!in_array($array[0] . $array[1], $notValidWalk) && !in_array($array[1] . $array[0], $notValidWalk)) {
$section1 = true;
}
}
while ($section2 == false) {
if ($array[1] == 9 && $array[2] == 9) {
$array[1] = 1;
$key = $array[0] . $array[1] . $array[2] . $array[3] . $array[4] . $array[5];
$array = array_map('intval', str_split($key));
}
if ($array[1] == 0) {
$array[1] = 1;
$key = $array[0] . $array[1] . $array[2] . $array[3] . $array[4] . $array[5];
$array = array_map('intval', str_split($key));
}
if (in_array($array[1] . $array[2], $notValidWalk) || in_array($array[2] . $array[1], $notValidWalk)) {
$section2 = false;
$tmp = ($array[1] . $array[2]) + 1;
$key = $array[0] . $tmp . $array[3] . $array[4] . $array[5];
$array = array_map('intval', str_split($key));
}
if (!in_array($array[1] . $array[2], $notValidWalk) && !in_array($array[2] . $array[1], $notValidWalk)) {
$section2 = true;
}
}
while ($section3 == false) {
if ($array[2] == 9 && $array[3] == 9) {
$array[2] = 1;
$key = $array[0] . $array[1] . $array[2] . $array[3] . $array[4] . $array[5];
$array = array_map('intval', str_split($key));
}
if ($array[2] == 0) {
$array[2] = 1;
$key = $array[0] . $array[1] . $array[2] . $array[3] . $array[4] . $array[5];
$array = array_map('intval', str_split($key));
}
if (in_array($array[2] . $array[3], $notValidWalk) || in_array($array[3] . $array[2], $notValidWalk)) {
$section3 = false;
$tmp = ($array[2] . $array[3]) + 1;
$key = $array[0] . $array[1] . $tmp . $array[4] . $array[5];
$array = array_map('intval', str_split($key));
}
if (!in_array($array[2] . $array[3], $notValidWalk) && !in_array($array[3] . $array[2], $notValidWalk)) {
$section3 = true;
}
}
while ($section4 == false) {
if ($array[3] == 9 && $array[4] == 9) {
$array[3] = 1;
$key = $array[0] . $array[1] . $array[2] . $array[3] . $array[4] . $array[5];
$array = array_map('intval', str_split($key));
}
if ($array[3] == 0) {
$array[3] = 1;
$key = $array[0] . $array[1] . $array[2] . $array[3] . $array[4] . $array[5];
$array = array_map('intval', str_split($key));
}
if (in_array($array[3] . $array[4], $notValidWalk) || in_array($array[4] . $array[3], $notValidWalk)) {
$section4 = false;
$tmp = ($array[3] . $array[4]) + 1;
$key = $array[0] . $array[1] . $array[2] . $tmp . $array[5];
$array = array_map('intval', str_split($key));
}
if (!in_array($array[3] . $array[4], $notValidWalk) && !in_array($array[4] . $array[3], $notValidWalk)) {
$section4 = true;
}
}
while ($section5 == false) {
if ($array[4] == 9 && $array[5] == 9) {
$array[4] = 1;
$key = $array[0] . $array[1] . $array[2] . $array[3] . $array[4] . $array[5];
$array = array_map('intval', str_split($key));
}
if ($array[4] == 0) {
$array[4] = 1;
$key = $array[0] . $array[1] . $array[2] . $array[3] . $array[4] . $array[5];
$array = array_map('intval', str_split($key));
}
if (in_array($array[4] . $array[5], $notValidWalk) || in_array($array[5] . $array[4], $notValidWalk)) {
$section5 = false;
$tmp = ($array[4] . $array[5]) + 1;
$key = $array[0] . $array[1] . $array[2] . $array[3] . $tmp;
$array = array_map('intval', str_split($key));
}
if (!in_array($array[4] . $array[5], $notValidWalk) && !in_array($array[5] . $array[4], $notValidWalk)) {
$section5 = true;
}
}
return $array = $array[0] . $array[1] . $array[2] . $array[3] . $array[4] . $array[5];
}
Я хочу создать действительную базу прогулок из случайных 6-значных чисел.
Итак, вы хотите, чтобы он генерировал действительную прогулку на основе 6 цифр, которые вы передаете функции?
Да, точно....
Прогулка не обязательно будет шестизначной, верно? Например, если передать ему 546512, чего вы ожидаете в результате?
Да это правильно. но я ожидаю, что последний ключ будет состоять не менее чем из 4 цифр, потому что я думаю, что менее 4 узлов легко угадать. поэтому для 546512 я ожидаю, что он изменится на число, которое следует правилам для шаблона Android и не имеет повторяющихся цифр . (моя функция работает хорошо, но в некоторых случаях ее алгоритм генерирует повторяющиеся цифры.)






Вы хотите создать действительную прогулку или проверить, действительна прогулка или нет?