#include <iostream>
#include <vector>
#include <list>
#include <cassert>
using namespace std;
struct node
{
int x,y;
node(int x1,int y1)
{
x=x1;
y=y1;
}
};
class SnakeGame
{
private:
int current;
int width;
int height;
vector<node*> food;
list<node*> snake;
public:
SnakeGame(int width,int height,vector<node*> food)
{
this->current = 0;
this->height = height;
this->width = width;
this->food = food;
this->snake.clear();
this->snake.push_back(new node(0,0));
}
int move(string direction)
{
int snake_length = snake.size();
if(snake_length > this->width*this->height)
{
return -1;
}
node*snake_head = this->snake.front();
int snake_head_x = snake_head->x;
int snake_head_y = snake_head->y;
int new_snake_head_x = (direction == "U")?snake_head_x-1:(direction=="D")?snake_head_x+1:snake_head_x;
int new_snake_head_y = (direction == "L")?snake_head_y-1:(direction == "R")?snake_head_y+1:snake_head_y;
if(new_snake_head_x < 0 || new_snake_head_x > this->height)
{
return -1;
}
if(new_snake_head_y < 0 || new_snake_head_y > this->width)
{
return -1;
}
node*new_snake_head = new node(new_snake_head_x,new_snake_head_y);
if(this->current < this->food.size() && new_snake_head->x == food[this->current]->x && new_snake_head->y == food[this->current]->y)
{
this->current++;
}
else
{
this->snake.pop_back();
}
for(auto it=this->snake.begin();it!=this->snake.end();it++)
{
node*val = *(it);
if(val->x == new_snake_head->x && val->y == new_snake_head->y)
{
return -1;
}
}
this->snake.push_front(new_snake_head);
return this->current;
}
};
int main() {
vector<node*> food;
food.push_back(new node(1,2));
food.push_back(new node(0,1));
//food = {{1, 2}, {0, 1}};
SnakeGame snakeGame(3, 2, food);
assert(0 == snakeGame.move("R"));
assert(0 == snakeGame.move("D"));
assert(1 == snakeGame.move("R"));
assert(1 == snakeGame.move("U"));
assert(2 == snakeGame.move("L"));
assert(-1 == snakeGame.move("U"));
//food = {{1, 1}, {1, 0}, {0, 0}};
food.clear();
food.push_back(new node(1,1));
food.push_back(new node(1,0));
food.push_back(new node(0,0));
snakeGame = SnakeGame(2, 2, food);
assert(0 == snakeGame.move("R"));
assert(1 == snakeGame.move("D"));
assert(2 == snakeGame.move("L"));
assert(3 == snakeGame.move("U"));
assert(3 == snakeGame.move("R"));
assert(3 == snakeGame.move("D"));
assert(3 == snakeGame.move("L"));
assert(-1 == snakeGame.move("L"));
cout << "\nPassed All\n";
return 0;
}