using System.Collections.Generic;
public static int[][] dirs = {new int[]{0,1,1,0},
public static void Main()
Console.WriteLine(NumEnclaves(dirs));
public static int NumEnclaves(int[][] grid) {
int m = grid.Length, n = grid[0].Length;
bool[][] visited = new bool[m][];
for (int i = 0; i < m; i++) {
visited[i] = new bool[n];
Queue<Tuple<int, int>> queue = new Queue<Tuple<int, int>>();
for (int i = 0; i < m; i++) {
queue.Enqueue(new Tuple<int, int>(i, 0));
if (grid[i][n - 1] == 1) {
visited[i][n - 1] = true;
queue.Enqueue(new Tuple<int, int>(i, n - 1));
for (int j = 1; j < n - 1; j++) {
queue.Enqueue(new Tuple<int, int>(0, j));
if (grid[m - 1][j] == 1) {
visited[m - 1][j] = true;
queue.Enqueue(new Tuple<int, int>(m - 1, j));
while (queue.Count > 0) {
Tuple<int, int> cell = queue.Dequeue();
int currRow = cell.Item1, currCol = cell.Item2;
foreach (int[] dir in dirs) {
int nextRow = currRow + dir[0], nextCol = currCol + dir[1];
if (nextRow >= 0 && nextRow < m && nextCol >= 0 && nextCol < n && grid[nextRow][nextCol] == 1 && !visited[nextRow][nextCol]) {
visited[nextRow][nextCol] = true;
queue.Enqueue(new Tuple<int, int>(nextRow, nextCol));
for (int i = 1; i < m - 1; i++) {
for (int j = 1; j < n - 1; j++) {
if (grid[i][j] == 1 && !visited[i][j]) {