Splender
Здравейте колеги,
Аз съм малко назад с материала, защото реших да почивам малко по-дълно, но ще се постарая да наваксам. За момента имам затруднение със задачата Splender. Знам че не е задължителна но ми стана любопитно и не съм много сигурен къде греша, надявам се да може да ми помогнете.
Това е кодът ми:
#include <iostream>
#include <list>
#include <iterator>
#include <vector>
#include <string>
class Splender
{
private:
std::list<char> _dirPriorities = {'S', 'E', 'N', 'W'};
bool _endCondition = false;
bool _inverted = false;
bool _breaker = false;
std::list<char>::iterator _currPriorioty = _dirPriorities.begin();
std::vector<std::vector <char>> _map;
std::pair<int,int> _currentLocation;
void _advancePriority(){
if(!_inverted){
if(_currPriorioty == _dirPriorities.end()){
_currPriorioty = _dirPriorities.begin();
}
else _currPriorioty++;
}
else{
if(_currPriorioty == _dirPriorities.begin()){
_currPriorioty = _dirPriorities.end();
}
else _currPriorioty--;
}
}
std::pair<int,int> _futureLocation(){
auto output = std::make_pair(_currentLocation.first, _currentLocation.second);
switch (*_currPriorioty)
{
case 'S':
output = std::make_pair(_currentLocation.first+1, _currentLocation.second);
break;
case 'E':
output = std::make_pair(_currentLocation.first, _currentLocation.second+1);
break;
case 'N':
output = std::make_pair(_currentLocation.first-1, _currentLocation.second);
break;
case 'W':
output = std::make_pair(_currentLocation.first, _currentLocation.second-1);
break;
default:
std::cout << "something went wrong in calculating the future direction";
break;
}
return output;
}
void _printMove(){
switch (*_currPriorioty)
{
case 'S':
std::cout << "SOUTH\n";
break;
case 'E':
std::cout << "EAST\n";
break;
case 'N':
std::cout << "NORTH\n";
break;
case 'W':
std::cout << "WEST\n";
break;
default:
std::cout << "something went wrong in calculating the future direction";
break;
}
}
public:
Splender(){
int x=0,y=0;
std::cin >> x>> y;
std::cin.ignore();
for (int i = 0; i < x; i++)
{
std::vector <char> line;
std::string stringLine;
getline(std::cin,stringLine);
for (int j = 0; j < y; j++)
{
char token = stringLine[j];
if(token == '@'){
_currentLocation = std::make_pair(i,j);
}
line.push_back(token);
}
_map.push_back(line);
}
}
~Splender(){
_map.clear();
}
bool getEndGoal(){
return _endCondition;
}
void makeTurn(){
auto futurelocation = _futureLocation();
char nextStep = _map[futurelocation.first][futurelocation.second];
switch (nextStep)
{
case ' ':
_currentLocation = futurelocation;
_printMove();
break;
case '#':
_advancePriority();
_currentLocation = _futureLocation();
_printMove();
break;
case 'X':
if(_breaker){
_map[futurelocation.first][futurelocation.second] = ' ';
_currentLocation = futurelocation;
_printMove();
}
else {
_advancePriority();
_currentLocation= _futureLocation();
_printMove();
}
break;
case 'B':
_breaker = !_breaker;
_currentLocation = futurelocation;
_printMove();
break;
case 'I':
_inverted = !_inverted;
_currentLocation = futurelocation;
_printMove();
break;
case 'S':
_printMove();
_currPriorioty = _dirPriorities.begin();
_currentLocation = futurelocation;
break;
case 'E':
_printMove();
_currPriorioty = _dirPriorities.begin();
std::advance(_currPriorioty, 1);
_currentLocation = futurelocation;
break;
case 'N':
_printMove();
_currPriorioty = _dirPriorities.begin();
std::advance(_currPriorioty, 2);
_currentLocation = futurelocation;
break;
case 'W':
_printMove();
_currPriorioty = _dirPriorities.begin();
std::advance(_currPriorioty, 3);
_currentLocation = futurelocation;
break;
case '$':
_printMove();
_endCondition = true;
break;
default:
break;
}
}
};
int main(){
std::cin.sync_with_stdio(false);
std::cout.sync_with_stdio(false);
Splender splender;
while(!splender.getEndGoal()){
splender.makeTurn();
}
return 1;
}
Благодаря много за съветите!
Поправих малко кода спрямо предложенията, но пакл имам същите проблеми като преди:
Привет, отново,
Благодаря за насоката.
Сега с радост ще ти помогна, защото ще ми отнеме 10 минути, а не 2 часа :)
Задачата ти е добре.
2 малки корекции (по-скоро издребнявания от моя страна)
- не ползвай std::list - ползвай std::vector
- не копирай нищо различно от примитивен тип данни. Визирам структурата ти Point. Подавай я по референция на функциите.
Виждам, че ти гърми нулев тест в Judge.
Нулините тестове за тестове, на които им имаш входа и изхода (в условието на задачата).
Защо поне не опита да пуснеш локално този тест с входните му данни?
Щеше да си разбереш проблема.
Няма значение - жив и здрав.
Забелязвам, че всички твои успешни тестове минават мигновенно ~0ms.
Всички гърмящи за време тестове умират на 6000ms (6 секунди).
И умират, защото Judge ги е убил, а не защото са отнели точно 6 секунди.
Това е ясна индикация, че стигат да безкраен цикъл в някой случай.
Пример за безкраен цикъл в този сценарий: EAST, WEST, EAST, WEST, EAST ...
Последният тест ти гърми, защото си изтървал едно от условията в задачата.
На картата може да има двойка телепорти. Прочети пак условието.
Поздрави и те очаквам пак със 100/100!