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

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

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

Добавлено через 2 минуты
И нужно массив на минимум два символа, а не один, ты про завершающий нуль забыл
MihaniX
 Аватар для 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
Эксперт С++
1594 / 986 / 117
Регистрация: 27.09.2009
Сообщений: 1,902
Завершенные тесты: 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
 Аватар для MihaniX
134 / 44 / 1
Регистрация: 06.08.2013
Сообщений: 292
Записей в блоге: 4
20.12.2013, 22:53  [ТС]     Робот К-79 #5
Nick Alte, У меня программа вылетела... И вывела хрень.
Nick Alte
Эксперт С++
1594 / 986 / 117
Регистрация: 27.09.2009
Сообщений: 1,902
Завершенные тесты: 1
20.12.2013, 22:54     Робот К-79 #6
Вот поэтому и надо выделять достаточное количество памяти. Или пользоваться string, которая сама это делает.
MihaniX
 Аватар для MihaniX
134 / 44 / 1
Регистрация: 06.08.2013
Сообщений: 292
Записей в блоге: 4
20.12.2013, 23:06  [ТС]     Робот К-79 #7
Я не стал пользоваться string. Вспомнил что по условию длина цепочки не более 200 символов.
Кстати команд S не более 50. Так что вектор можно не импортировать. Ну и ладно. Пошел сдавать в тестовую систему)

Добавлено через 4 минуты
В общем нет, тесты не все проходит... Где-то ошибка...
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4661 / 2487 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
20.12.2013, 23:54     Робот К-79 #8
Цитата Сообщение от MihaniX Посмотреть сообщение
В общем нет, тесты не все проходит... Где-то ошибка...
последний вариант программы покажите
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++
 Аватар для valeriikozlov
4661 / 2487 / 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++ Робот может перемещаться в четырех направлениях
Робот, вероятность местонахождения в мире с ориентирами, histogram filter C++
Создать класс Робот C++
Где окажется робот после выполнения заданных команд? C++
Где окажется робот после выполнения заданных команд? C++

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

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

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