Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

20.12.2013, 22:29. Просмотров 791. Ответов 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 вектора и сравниваю на каждой итерации цикла... Ставлю счетчик на число шагов...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2013, 22:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Робот К-79 (C++):

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

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

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

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

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

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

10
coloc
погромист
411 / 247 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
20.12.2013, 22:44 #2
Цитата Сообщение от MihaniX Посмотреть сообщение
char program[]="";
* * cin>>program;
а если пользователь введет больше, чем один символ?

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

Добавлено через 4 минуты
В общем нет, тесты не все проходит... Где-то ошибка...
0
valeriikozlov
Эксперт С++
4677 / 2503 / 322
Регистрация: 18.08.2009
Сообщений: 4,550
20.12.2013, 23:54 #8
Цитата Сообщение от MihaniX Посмотреть сообщение
В общем нет, тесты не все проходит... Где-то ошибка...
последний вариант программы покажите
0
MihaniX
135 / 45 / 1
Регистрация: 06.08.2013
Сообщений: 292
Записей в блоге: 4
21.12.2013, 00:12  [ТС] #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;
}
0
valeriikozlov
Эксперт С++
4677 / 2503 / 322
Регистрация: 18.08.2009
Сообщений: 4,550
21.12.2013, 00:25 #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;
1
MihaniX
135 / 45 / 1
Регистрация: 06.08.2013
Сообщений: 292
Записей в блоге: 4
21.12.2013, 12:29  [ТС] #11
Уррра! Задача решилась!!!
Спасибо всем огромное!!!
valeriikozlov, да, действительно хороший способ , жаль я до него не додумался...
0
21.12.2013, 12:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.12.2013, 12:29
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

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