67 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | |
| title: Lee's Algorithm
 | |
| ---
 | |
| 
 | |
| ## Lee's Algorithm
 | |
| 
 | |
| The Lee algorithm is one possible solution for maze routing problems. It always gives an optimal solution, if one exists, but is
 | |
| slow and requires large memory for dense layout.
 | |
| 
 | |
| ### Understanding how it works
 | |
| 
 | |
| The algorithm is a `breadth-first` based algorithm that uses `queues` to store the steps. It usually uses the following steps:
 | |
|   
 | |
|   1. Choose a starting point and add it to the queue.
 | |
|   2. Add the valid neighboring cells to the queue.
 | |
|   3. Remove the position you are on from the queue and continue to the next element.
 | |
|   4. Repeat steps 2 and 3 until the queue is empty.
 | |
|   
 | |
| ### Implementation
 | |
| 
 | |
| C++ has the queue already implemented in the `<queue>` library, but if you are using something else you are welcome to implement
 | |
| your own version of queue.
 | |
| 
 | |
| C++ code:
 | |
| 
 | |
| ```c++
 | |
| 
 | |
| int dl[] = {-1, 0, 1, 0}; // these arrays will help you travel in the 4 directions more easily
 | |
| int dc[] = {0, 1, 0, -1};
 | |
| 
 | |
| queue<int> X, Y; // the queues used to get the positions in the matrix
 | |
| 
 | |
| X.push(start_x); //initialize the queues with the start position
 | |
| Y.push(start_y);
 | |
| 
 | |
| void lee()
 | |
| {
 | |
|   int x, y, xx, yy;
 | |
|   while(!X.empty()) // while there are still positions in the queue
 | |
|   {
 | |
|     x = X.front(); // set the current position
 | |
|     y = Y.front();
 | |
|     for(int i = 0; i < 4; i++)
 | |
|     {
 | |
|       xx = x + dl[i]; // travel in an adiacent cell from the current position
 | |
|       yy = y + dc[i];
 | |
|       if('position is valid') //here you should insert whatever conditions should apply for your position (xx, yy)
 | |
|       {
 | |
|           X.push(xx); // add the position to the queue
 | |
|           Y.push(yy);
 | |
|           mat[xx][yy] = -1; // you usually mark that you have been to this position in the matrix
 | |
|       }
 | |
|       
 | |
|     }
 | |
|     
 | |
|     X.pop(); // eliminate the first position, as you have no more use for it
 | |
|     Y.pop();
 | |
|     
 | |
|   }
 | |
| 
 | |
| 
 | |
| }
 | |
| 
 | |
| ```
 | |
| 
 | |
| 
 |