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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
MihaniX
134 / 44 / 1
Регистрация: 06.08.2013
Сообщений: 292
Записей в блоге: 4
#1

Робот К-79 - C++

20.12.2013, 22:29. Просмотров 660. Ответов 10
Метки нет (Все метки)

C++
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#include <iostream>
#include <vector>
 
using namespace std;
 
int main(int argc, char* argv[])
{
    char program[]="";
    cin>>program;
    char direction='a';
    vector<int> Y;
    vector<int> X;
    X.push_back(0); Y.push_back(0);
    unsigned long int x, y;
    unsigned long int counter=0;
    const unsigned long int num=sizeof(program)/(sizeof(program[0]));
    int q=0;
 
    for (unsigned long int i=0; i<num; i++)
    {
        switch (program[i])
        {
        case 'R':
            {
                switch (direction)
                {
                case 'a':
                    {
                        direction='b';
                        break;
                    }
                case 'b':
                    {
                        direction='c';
                        break;
                    }
                case 'c':
                    {
                        direction='d';
                        break;
                    }
                case 'd':
                    {
                        direction='a';
                        break;
                    }
                }
                break;
            }
        case 'L':
            {
                switch (direction)
                {
                case 'a':
                    {
                        direction='d';
                        break;
                    }
                case 'b':
                    {
                        direction='a';
                        break;
                    }
                case 'c':
                    {
                        direction='b';
                        break;
                    }
                case 'd':
                    {
                        direction='c';
                        break;
                    }
                }
                break;
            }
        case 'S':
            {
                 switch (direction)
                 {
                 case 'a':
                     {
                         x++;
                         break;
                     }
                 case 'b':
                     {
                         y++;
                         break;
                     }
                 case 'c':
                     {
                         x--;
                         break;
                     }
                 case 'd':
                     {
                         y--;
                         break;
                     }
                 }
                 /* ... */
                 counter++;
                 for (unsigned long int i=0; i<X.size(); i++)
                 {
                     if ((X[i]==x)&&(Y[i]==y))
                     {
                         q=1;
                         goto exit;
                     }
                 }
 
                 /* ... */
                 Y.push_back(y); X.push_back(x);
                 break;
            }
 
 
        }
    }
    exit:
        switch (q)
        {
        case 1:
            {
                cout<<counter;
                break;
            }
        case 0:
            {
                cout<<-1;
                break;
            }
        }
    return 0;
}
Условие:
Максимальное время работы на одном тесте:

2 секунды

Максимальный объем используемой памяти:

16 мегабайт

Петя написал программу движения робота К-79. Программа состоит из следующих команд:
S — сделать шаг вперед
L — повернуться на 90 влево
R — повернуться на 90 вправо
Напишите программу, которая по заданной программе для робота определит, сколько шагов он сделает прежде, чем впервые вернется на то место, на котором уже побывал до этого, либо установит, что этого не произойдет.
Формат входных данных
Во входном файле записана одна строка из заглавных латинских букв S, L, R, описывающая программу для робота. Общее число команд в программе не превышает 200, при этом команд S — не более 50.
Формат выходных данных
В выходной файл выведите, сколько шагов будет сделано (то есть выполнено команд S) прежде, чем робот впервые окажется в том месте, через которое он уже проходил. Если такого не произойдет, выведите в выходной файл число –1.

Что у меня не так?? Я догадываюсь что не срабатывает структура switch(...) case: {} но почему??? Алгоритм вроде верный:
завожу список посещенных клеток в 2 вектора и сравниваю на каждой итерации цикла... Ставлю счетчик на число шагов...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2013, 22:29     Робот К-79
Посмотрите здесь:

робот - C++
Робот может перемещаться в четырех направлениях (&quot;С&quot; -- север, &quot;З&quot; -- запад, &quot;Ю&quot; -- юг, &quot;В&quot; -- восток) и принимать три цифровые команды: 0...

Манипуляционный робот - C++
Здравствуйте. Есть задание: Пользователь вводит число звеньев манипуляционного робота (N), и координаты центра объекта подлежащего к...

Робот в лабиринте - C++
Спасибо тебе loki ты клёвый кодер! У меня есть ещё одно задание, последние которое мне надо сдать, если сможешь помоги! Написать...

Создать класс Робот - C++
Здраствуйте, я только начинающий в деле. Могли бы помочь с задачами, хочется все равно решить ,но не получается. Условие таково: Опишите...

Робот. Алгоритм объезда препятствия - C++
Помогите пожалуйста составить код по данному алгоритму. c++

Робот (подобие игры Sokoban) - C++
Написать программу, на подобие игры Sokoban 1) создаёте матрицу нужного размера 2) из входного файла считываете заполнение поля 3)...

Робот может перемещаться в четырех направлениях - C++
Робот может перемещаться в четырех направлениях («С» – север, «З» – запад, «Ю» — юг, «В» — восток) и принимать три цифровые команды: 0 —...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
coloc
погромист
409 / 245 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
20.12.2013, 22:44     Робот К-79 #2
Цитата Сообщение от MihaniX Посмотреть сообщение
char program[]="";
* * cin>>program;
а если пользователь введет больше, чем один символ?

Добавлено через 2 минуты
И нужно массив на минимум два символа, а не один, ты про завершающий нуль забыл
MihaniX
134 / 44 / 1
Регистрация: 06.08.2013
Сообщений: 292
Записей в блоге: 4
20.12.2013, 22:48  [ТС]     Робот К-79 #3
Ну у меня работает. Проверьте у себя тоже. IDE Code::Blocks у меня. Я не уверен, я просто интуитивно так сделал и оно заработало...
C++
1
2
3
4
char str[]="";
cin>>str;
system("pause>nul");
cout<<str;
Код
Ввод:
asdfasdfafds
Вывод:
asdfasdfafds
Добавлено через 2 минуты
А что за завершающий нуль? я не понял...
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,927
Завершенные тесты: 1
20.12.2013, 22:49     Робот К-79 #4
А если так?
C++
1
2
3
4
5
char str[]="";
cin>>str;
int len = strlen(str);
system("pause>nul")
cout<<str<<endl<<len<<endl;
MihaniX
134 / 44 / 1
Регистрация: 06.08.2013
Сообщений: 292
Записей в блоге: 4
20.12.2013, 22:53  [ТС]     Робот К-79 #5
Nick Alte, У меня программа вылетела... И вывела хрень.
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,927
Завершенные тесты: 1
20.12.2013, 22:54     Робот К-79 #6
Вот поэтому и надо выделять достаточное количество памяти. Или пользоваться string, которая сама это делает.
MihaniX
134 / 44 / 1
Регистрация: 06.08.2013
Сообщений: 292
Записей в блоге: 4
20.12.2013, 23:06  [ТС]     Робот К-79 #7
Я не стал пользоваться string. Вспомнил что по условию длина цепочки не более 200 символов.
Кстати команд S не более 50. Так что вектор можно не импортировать. Ну и ладно. Пошел сдавать в тестовую систему)

Добавлено через 4 минуты
В общем нет, тесты не все проходит... Где-то ошибка...
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
20.12.2013, 23:54     Робот К-79 #8
Цитата Сообщение от MihaniX Посмотреть сообщение
В общем нет, тесты не все проходит... Где-то ошибка...
последний вариант программы покажите
MihaniX
134 / 44 / 1
Регистрация: 06.08.2013
Сообщений: 292
Записей в блоге: 4
21.12.2013, 00:12  [ТС]     Робот К-79 #9
C++
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#include <iostream>
#include <vector>
 
 
using namespace std;
 
int main(int argc, char* argv[])
{
    char program[200]="";
    cin>>program;
    char direction='a';
    vector<int> Y;
    vector<int> X;
    X.push_back(0); Y.push_back(0);
    unsigned long int x, y;
    unsigned long int counter=0;
    const unsigned long int num=sizeof(program)/(sizeof(program[0]));
    int q=0;
 
    for (unsigned long int i=0; i<num; i++)
    {
        switch (program[i])
        {
        case 'R':
            {
                switch (direction)
                {
                case 'a':
                    {
                        direction='b';
                        break;
                    }
                case 'b':
                    {
                        direction='c';
                        break;
                    }
                case 'c':
                    {
                        direction='d';
                        break;
                    }
                case 'd':
                    {
                        direction='a';
                        break;
                    }
                }
                break;
            }
        case 'L':
            {
                switch (direction)
                {
                case 'a':
                    {
                        direction='d';
                        break;
                    }
                case 'b':
                    {
                        direction='a';
                        break;
                    }
                case 'c':
                    {
                        direction='b';
                        break;
                    }
                case 'd':
                    {
                        direction='c';
                        break;
                    }
                }
                break;
            }
        case 'S':
            {
                 switch (direction)
                 {
                 case 'a':
                     {
                         x++;
                         break;
                     }
                 case 'b':
                     {
                         y++;
                         break;
                     }
                 case 'c':
                     {
                         x--;
                         break;
                     }
                 case 'd':
                     {
                         y--;
                         break;
                     }
                 }
                 /* ... */
                 counter++;
                 for (unsigned long int i=0; i<X.size(); i++)
                 {
                     if ((X[i]==x)&&(Y[i]==y))
                     {
                         q=1;
                         goto exit;
                     }
                 }
 
                 /* ... */
                 Y.push_back(y); X.push_back(x);
                 break;
            }
 
 
        }
    }
    exit:
        switch (q)
        {
        case 1:
            {
                cout<<counter;
                break;
            }
        case 0:
            {
                cout<<0;
                cout<<counter;
                break;
            }
        }
    return 0;
}
valeriikozlov
Эксперт C++
4669 / 2495 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
21.12.2013, 00:25     Робот К-79 #10
см комментарии:
C++
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#include <iostream>
#include <vector>
 
 
using namespace std;
 
int main(int argc, char* argv[])
{
    char program[200]="";// размер массива делайте 201 или более
    cin>>program;
    char direction='a';
    vector<int> Y;
    vector<int> X;
    X.push_back(0); Y.push_back(0);
    unsigned long int x, y;// этим двум переменным присвойте значения 0
    unsigned long int counter=0;
    const unsigned long int num=sizeof(program)/(sizeof(program[0]));
    int q=0;
 
    for (unsigned long int i=0; i<num; i++)
    {
        switch (program[i])
        {
        case 'R':
            {
                switch (direction)
                {
                case 'a':
                    {
                        direction='b';
                        break;
                    }
                case 'b':
                    {
                        direction='c';
                        break;
                    }
                case 'c':
                    {
                        direction='d';
                        break;
                    }
                case 'd':
                    {
                        direction='a';
                        break;
                    }
                }
                break;
            }
        case 'L':
            {
                switch (direction)
                {
                case 'a':
                    {
                        direction='d';
                        break;
                    }
                case 'b':
                    {
                        direction='a';
                        break;
                    }
                case 'c':
                    {
                        direction='b';
                        break;
                    }
                case 'd':
                    {
                        direction='c';
                        break;
                    }
                }
                break;
            }
        case 'S':
            {
                 switch (direction)
                 {
                 case 'a':
                     {
                         x++;
                         break;
                     }
                 case 'b':
                     {
                         y++;
                         break;
                     }
                 case 'c':
                     {
                         x--;
                         break;
                     }
                 case 'd':
                     {
                         y--;
                         break;
                     }
                 }
                 /* ... */
                 counter++;
                 for (unsigned long int i=0; i<X.size(); i++)
                 {
                     if ((X[i]==x)&&(Y[i]==y))
                     {
                         q=1;
                         goto exit;
                     }
                 }
 
                 /* ... */
                 Y.push_back(y); X.push_back(x);
                 break;
            }
 
 
        }
    }
    exit:
        switch (q)
        {
        case 1:
            {
                cout<<counter;
                break;
            }
        case 0:
            {
                cout<<0;// по условию нужно выводить не 0 и значение counter а "-1"
                cout<<counter;
                break;
            }
        }
    return 0;
}
Добавлено через 4 минуты
и на будущее один способ. вместо вот этого:
C++
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
        switch (program[i])
        {
        case 'R':
            {
                switch (direction)
                {
                case 'a':
                    {
                        direction='b';
                        break;
                    }
                case 'b':
                    {
                        direction='c';
                        break;
                    }
                case 'c':
                    {
                        direction='d';
                        break;
                    }
                case 'd':
                    {
                        direction='a';
                        break;
                    }
                }
                break;
            }
        case 'L':
            {
                switch (direction)
                {
                case 'a':
                    {
                        direction='d';
                        break;
                    }
                case 'b':
                    {
                        direction='a';
                        break;
                    }
                case 'c':
                    {
                        direction='b';
                        break;
                    }
                case 'd':
                    {
                        direction='c';
                        break;
                    }
                }
                break;
            }
можно завести переменную например int direction=0. (принимать она будет всего 4 значения: 0,1,2,3)
Поворачиваете вправо:
direction=(direction+1)%4;
поворачиваете влево:
direction=(direction+3)%4;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.12.2013, 12:29     Робот К-79
Еще ссылки по теме:

Сколько раз робот пересекал свой путь - C++
На плоскости находится робот, в памяти которого записана программа. Эта программа представляет собой последовательность чисел, каждое число...

Где окажется робот после выполнения заданных команд? - C++
Робот находится в точке с целочисленными координатами X0, Y0. Ему дистанционно посылается N команд. Каждая команда может быть одной из...

Робот, вероятность местонахождения в мире с ориентирами, histogram filter - C++
Всем привет! Существует следующая задача: Мир, в котором &quot;живет&quot; робот, представлен в виде 10 квадратов (выстроенных в ряд,...

Где окажется робот после выполнения заданных команд? - C++
Робот находится в точке с целочисленными координатами X0, Y0. Ему дистанционно посылается N команд. Каждая команда может быть одной из...

Робот должен добраться от А в пункт Б самым коротким путём - C++
Здравствуйте, прошу помогите сделать Домашнее задание. :umnik: Задача очень проста)): робот должен добраться от А в пункт Б самым...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
MihaniX
134 / 44 / 1
Регистрация: 06.08.2013
Сообщений: 292
Записей в блоге: 4
21.12.2013, 12:29  [ТС]     Робот К-79 #11
Уррра! Задача решилась!!!
Спасибо всем огромное!!!
valeriikozlov, да, действительно хороший способ , жаль я до него не додумался...
Yandex
Объявления
21.12.2013, 12:29     Робот К-79
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru