# Leetcode 353 Solution

https://leetcode.com/problems/design-snake-game

## Solution

``````class SnakeGame {
queue<pair<int, int>> q;
set<pair<int, int>> snake;
queue<pair<int, int>> foods;
int m_width;
int m_height;

public:
/** Initialize your data structure here.
@param width - screen width
@param height - screen height
@param food - A list of food positions
E.g food = [[1,1], [1,0]] means the first food is positioned at [1,1], the second is at [1,0]. */
SnakeGame(int width, int height, vector<pair<int, int>> food) {
m_width = width;
m_height = height;
q.push(make_pair(0, 0));
snake.insert(make_pair(0, 0));
for (auto pair : food)
foods.push(pair);
}

/** Moves the snake.
@param direction - 'U' = Up, 'L' = Left, 'R' = Right, 'D' = Down
@return The game's score after the move. Return -1 if game over.
Game over when snake crosses the screen boundary or bites its body. */
int move(string direction) {

if (direction == "U")
next.first--;
else if (direction == "L")
next.second--;
else if (direction == "R")
next.second++;
else if (direction == "D")
next.first++;

if (next.first < 0 || next.first >= m_height || next.second < 0 || next.second >= m_width)
return -1;

if (snake.find(next) != snake.end() && next != q.front())
return -1;

if (foods.empty() == false && foods.front() == next)
{
snake.insert(next);
q.push(next);
foods.pop();
}
else
{
snake.erase(q.front());
q.pop();
snake.insert(next);
q.push(next);
}

return q.size() - 1;
}
};

/**
* Your SnakeGame object will be instantiated and called as such:
* SnakeGame obj = new SnakeGame(width, height, food);
* int param_1 = obj.move(direction);
*/
``````