Форум программистов, компьютерный форум CyberForum.ru

Неточность в понимании условия задачи "Жук" (acmp) - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Логика switch http://www.cyberforum.ru/cpp-beginners/thread930602.html
Программа должна расчитывать количество проданного товара, суть проблемы, кода вместо численных значений в вариантах case я использую буквенные значения названий товара, то все идет по логике программы, когда я использую проверку с целыми значениями у меня работает случай default разьясните мне пожалуйста в чем проблема? #include<iostream> using namespace std; int main() { int count =...
C++ Мини-брутфорс Задан паттерн XXyyX, где Х может принимать следующие значения: D,J,K,L,L,X,Z, а Y - f,n,s. Необходимо найти все возможные комбинации, при этом символы не должны повторяться, кроме L, так как он встречается два раза. Одна из этих комбинаций валидна и ссылка вида http://www.steamgifts.com/giveaway/+Валидная_комбинация должна привести на существующую страницу, если комбинация невалидна, то... http://www.cyberforum.ru/cpp-beginners/thread930575.html
Структуры. Объединения. Битовые поля C++
Помогите с двумя простенькими программами. Требования: - не использовать шаблоны; - интерфейс должен разработан для неопытного пользователя; - размерность массива - неопределенная; - не использовать списки; - для реализации массива произвольного размера использовать функции прямого доступа и кучи (memcpy, memmove, malloc, resize и др.)
Си: Выдать слова текста и их длины, Сформировать новую строку по правилу C++
Задание: Задан некоторый текст, состоящий из слов. Словом считать последовательность символов, не содержащую пробел или другие знаки препинания. Предложения заканчиваются точкой. Длина текста не больше 200 символов, могут быть использованы любые символы. Задание для выполнения: 1) Считать текст из файла; 2) Выдать слова текста и их длины; 3) Сформировать новую строку из слов, состоящих...
C++ Вместо результата выводит непонятное число http://www.cyberforum.ru/cpp-beginners/thread930547.html
Сделал программу которая должна высчитывать по формуле, но она высчитывает не совсем то число. int chislo = Convert::ToInt32(textBox2->Text); int *chisla = new int; int lolx = Convert::ToInt32(textBox1->Text); int rezultat; int rexa; for(int i = lolx; i < chislo; i++) { chisla += (Convert::ToInt32(textBox1->Text)+i)*4; rezultat += chisla;
C++ Работа со строками и файлами года 2 не кодил на С++ вот решил вспомнить... суть задачи: открываем текстовый документ,и перебираем по очередно строки сравнивая их с нашей строкой если нашли такую то выводим сообщение в текстовом документе строки вида: 1234.txt подробнее

Показать сообщение отдельно
nuts23
0 / 0 / 0
Регистрация: 22.06.2013
Сообщений: 30

Неточность в понимании условия задачи "Жук" (acmp) - C++

29.07.2013, 22:37. Просмотров 800. Ответов 1
Метки (Все метки)

Жук
(Время: 1 сек. Память: 16 Мб Сложность: 30%)

Петя нашел в Интернете по адресу http://buglab.ru игру-головоломку "Жук", в которой от участников требуется построить для жука лабиринт таким образом, чтобы жук как можно дольше искал выход.

Жук всегда начинает свое движение с левого верхнего угла, а выход всегда находится в правом нижнем. Жук движется не оптимально, а следующим образом: он идет туда, где еще не был, либо был там реже. Т.е. проходя каждую клетку лабиринта, жук запоминает: сколько раз он был в этой клетке и при обдумывании направления своего движения в какой то конкретный момент он смотрит: сколько раз он был в клетке снизу, сколько справа, сколько слева и сколько сверху и движется туда, где он был меньше раз. Если таких направлений несколько и одно из них совпадает с текущим направлением движения, то он не меняет направления, иначе он движется согласно следующим приоритетам: вниз, направо, вверх, налево. Т.е. если минимальное число посещений сразу справа и слева (а двигался он при этом вверх или вниз), то жук идет направо, т.к. у "направо" приоритет выше. Следует заметить, что двигаясь по данному алгоритму жук всегда достигнет выхода в том случае, когда выход существует.

Изучив алгоритм движения жука Петя хочет написать программу, которая по заданному лабиринту определит количество перемещений жука прежде, чем он достигнет выхода. Помогите Пете с реализацией данной программы!

Входные данные

Входной файл INPUT.TXT в первой строке содержит разделенные пробелом целые числа N и M - количество строк и столбцов в лабиринте (4 <= N, M <= 100). Далее следует N строк, содержащих данные лабиринта построчно. Каждая строка содержит M символов - клетки лабиринта текущей строки, где символ "@" обозначает присутствие стены, а символ пробела - пустое пространство. Гарантируется, что граница лабиринта окружена стеной. Предполагается, что жук начинает свое движение из координаты (2, 2) и заканчивает в координате (M-1, N-1), подразумевается, что в этих координатах нет стен.

Выходные данные

В выходной файл OUTPUT.TXT выведите количество движений жука, если спасительный маршрут для жука существует, и -1 в противном случае.

Примеры: INPUT.TXT OUTPUT.TXT
1 6 6
@@@@@@
@ @
@ @
@ @ @@
@ @ @
@@@@@@ 20
2 8 30
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ @ @ @@@@ @ @ @@@@ @@ @
@ @ @@ @ @ @ @ @ @ @
@ @ @ @ @@ @@ @@ @@
@ @ @ @@
@ @ @@ @ @ @@@ @ @ @ @
@ @ @ @ @ @ @@ @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 630
3 4 4
@@@@
@ @@
@@ @
@@@@ -1
Моё решение:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include <stdio.h>
#include <stdio.h>
#include <math.h>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
int min(int x, int y)
{
    if (x > y)
        return y;
    else
        return x;
}
int main()
{
    freopen("input.txt","r",stdin);
    freopen("output.txt","w",stdout);
    int N, M;
    scanf("%d %d", &N, &M);
    char a;
    scanf("%c", &a);
    int A[100][100];
 
    for (int i = 0; i < N; ++i)
        for (int j = 0; j < M+1; ++j)
        {
            scanf("%c", &a);
            if (a == '@')
                A[i][j] = 10000;
            else if (a == ' ')
                A[i][j] = 0;
        }
    int i = 1;
    int j = 1;
    A[1][1] = 0;
    int mina;
    int path;
    path = 0;
    for (int i = 0; i < N; ++i)
        for (int j = 0; j < M; ++j)
    {
        printf("%d ", A[i][j]);
        if (j == M-1)
            printf("\n");
    }
    while (1)
    {
        mina = min(A[i][j+1], min(A[i][j-1], min(A[i+1][j], min(A[i-1][j], A[i][j]))));
        if (mina == A[i][j])
        {
 
            A[i][j] += 1;
            printf("%d %d", i, j);
        }
        else if (mina == A[i+1][j])
        {
 
            A[i+1][j] += 1;
            printf("%d %d", i+1, j);
            ++i;
        }
        else if (mina == A[i][j+1])
        {
 
            A[i][j+1] += 1;
            printf("%d %d", i, j+1);
            ++j;
 
        }
        else if (mina == A[i-1][j])
        {
 
            A[i-1][j] += 1;
            printf("%d %d", i-1, j);
            --i;
        }
        else if (mina == A[i][j-1])
        {
 
            A[i][j-1] += 1;
            printf("%d %d", i, j-1);
            --j;
        }
        ++path;
        printf("\n");
        if (i == N-2 && j == M-2)
            break;
    }
    printf("\n %d", path);
    return 0;
}
Согласно моему решению в первом примере ответ = 12.
Его путь (клетки нумеруются от 0 до 5):
1 1
2 1
3 1
4 1
4 1
3 1
2 1
2 2
2 3
3 3
4 3
4 4
Самое плохое, что, по моему пониманию условию, всё правильно. Однако в условии ответ = 20
Просьба указать, где я ошибся.
Спасибо.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru