diff --git a/docs/DSA-Problem-Solution/rotten-oranges.md b/docs/DSA-Problem-Solution/rotten-oranges.md
new file mode 100644
index 000000000..d31dc6c0a
--- /dev/null
+++ b/docs/DSA-Problem-Solution/rotten-oranges.md
@@ -0,0 +1,99 @@
+---
+id: rotten-oranges
+title: "Rotten Oranges Algorithm"
+sidebar_label: "RottenOranges algorithm"
+tags: [Leetcode, BFS, Graph, DSA, Rotten Oranges]
+description: "Solve the Rotten Oranges problem using Breadth-First Search (BFS) to determine the minimum time required for all fresh oranges to rot."
+---
+
+The Rotten Oranges problem is a grid-based problem that involves determining the minimum time required for all fresh oranges to rot given an initial configuration of fresh and rotten oranges.
+
+
+
+## Problem Definition
+
+**Given:** A 2D grid where each cell can have one of three values:
+0: an empty cell
+1: a fresh orange
+2: a rotten orange
+
+**Objective:** Return the minimum number of minutes needed for all fresh oranges to become rotten. If all oranges can’t rot, return -1.
+Algorithm Overview
+
+**Breadth-First Search (BFS) Approach:**
+
+Use BFS to simulate the spread of rotting from each rotten orange to adjacent fresh oranges. Each level of BFS represents one minute.
+Initialization:
+
+Initialize a queue with all initial rotten oranges and count the fresh oranges.
+Track the minutes taken for all oranges to rot.
+Processing BFS Levels:
+
+For each rotten orange, attempt to rot adjacent fresh oranges (up, down, left, right).
+Add newly rotten oranges to the queue and decrease the count of fresh oranges.
+Result Evaluation:
+
+
+
+If there are no remaining fresh oranges after BFS, return the minutes taken. If fresh oranges remain, return -1.
+Time Complexity
+Time Complexity: O(n * m), where n is the number of rows and m is the number of columns, as each cell is processed at most once.
+Space Complexity: O(n * m) for the BFS queue.
+C++ Implementation
+```
+cpp
+Copy code
+#include
+#include
+using namespace std;
+
+int orangesRotting(vector>& grid) {
+ int rows = grid.size();
+ int cols = grid[0].size();
+ queue> rottenQueue;
+ int freshOranges = 0;
+ int minutes = 0;
+
+ // Initialize queue with all initially rotten oranges and count fresh oranges
+ for (int i = 0; i < rows; i++) {
+ for (int j = 0; j < cols; j++) {
+ if (grid[i][j] == 2) {
+ rottenQueue.push({i, j});
+ } else if (grid[i][j] == 1) {
+ freshOranges++;
+ }
+ }
+ }
+
+ // Directions for adjacent cells (up, down, left, right)
+ vector> directions = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
+
+ // Perform BFS to rot adjacent oranges
+ while (!rottenQueue.empty() && freshOranges > 0) {
+ int size = rottenQueue.size();
+ minutes++;
+
+ for (int i = 0; i < size; i++) {
+ auto [x, y] = rottenQueue.front();
+ rottenQueue.pop();
+
+ for (auto [dx, dy] : directions) {
+ int newX = x + dx;
+ int newY = y + dy;
+
+ // Check if the adjacent cell is within bounds and has a fresh orange
+ if (newX >= 0 && newX < rows && newY >= 0 && newY < cols && grid[newX][newY] == 1) {
+ // Rot the fresh orange
+ grid[newX][newY] = 2;
+ freshOranges--;
+ rottenQueue.push({newX, newY});
+ }
+ }
+ }
+ }
+
+ // If there are fresh oranges left, return -1, otherwise return minutes taken
+ return freshOranges == 0 ? minutes : -1;
+}
+```
+This algorithm efficiently uses BFS to simulate the spread of rot across the grid, ensuring that all reachable fresh oranges rot in the minimum time or determining that it's impossible.