diff --git a/11input.txt b/11input.txt
new file mode 100644
index 0000000..f527eb3
--- /dev/null
+++ b/11input.txt
@@ -0,0 +1,90 @@
+LLLLLL.LLLL..LLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLL.LLLLL.LLLLLL.L.LL.LLLLLL.LLLLLLLLLLLLLLLL
+LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLL.LLL.LLLL.L.LLLLLL.LLLLLLLLLLLL.LLLLLLLL
+LLLLLLLL.LLL.LL..LLLLLLLLL.L.LLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLL.LLLLLLLL
+LLLLLL.LLLLL.LLL.LLLLLLLLL.LLLLLLLLLLL.LL.LLLLLL.LLLLLLLL.LLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLL
+LLLLLLLLLLLLL.LL.LLLLLLLLL..LLL.LLLLLLLLLLLLLLLLLLL.LLLLL.LLLLL.LLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLL
+LL..L.LLL.....L.L.L.....LL..L.LLLL..LL..LL..L.L.L.........LL.L..L..LL.L...L.LL..........LL....L.L..
+L.LLLLLLLLLLLLLL.LLLLLLLLL.LLLL.LLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLL
+.LLLLLLLLLLLLLLLL.LLLLLLLL.LLLL.LLLLLLLLL.LLLLLL.LLL.LLLL.LLLLL.LLLLLL.LLLL.LLLLLL.LLLLLLLLL.LLL.LL
+LLL.L..LLLLLLLLL..LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LL.LLL.LLLL.LLLLLL.LLLLLLLLL.LLLLLL
+.LLLLL.LLLLLLLLL.LLLLLLLLLLLLLL..LLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLL..LLL.LLLLLLLLLLLLLLLL.LLLLLL
+LLLLLLLLLLLLLLLL.LLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLL.LLLLL..LLLLLLLLLLLLLLLL
+LLLLL.LLLLLLLLLLLL.LLLLLLLLLLLL.LLL.LLLLL.LLLLLL.LLL.LLLLLLLLLL.L.L.L..LLLL.LLLLLL.LLLLLLLLL.LLLLLL
+LLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLL..LLLLLLLLL.LLLLLL
+..L....L......L..L..L.......LL.L..L............LL.LL.L.L.L..........L..L.L.LL.L.LL......L.L....L..L
+LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLL.L.LLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLL
+.LLLLL.LLLLLLLLL.LLLLLLLLL.LLLL.LLLLLLLLL.LLL.LLLLLLLLLL.LLLLLL.LL.LLL.LLLL.LLLLLL.LLLLLLLLL.LLL.L.
+LLLLL..LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LL.LLLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLL.LLLLLLLLL.LLLLLL
+LLLLLL.LLLLLLL.L.L.LLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLL.LLLLL.LLLL.LLLLLL.LLLLLL.LLLLLLLLLLLLLLLL
+LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLL.LL.LLLL.LLLLLLLLLLLL.LLL.LLLLLL
+L.LLLL.L.LLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLL.LLLLLLLL.LLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLL
+L.L...L...LL....LL....L..L.L.LLLL..LL..L.L....L.LL.L..L.L..LL.L..L..L..LLL..L..L..........L........
+LLLLLL.LLL.LLL.L.LLLLLLLLL.LLLLLLL.LLLLLL.LLL.LL.LLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL
+LLLLLL.LLLLLLLLLLLLLLLLLLL.L.LL.LLLLLLLLL.L.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL
+LLLLLL.LLLLLLLLLLLLLLLLLLL.LLLL.LLLLL.LLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLL
+LLLLLL..LLLLLLLL.LL.LLLLLL.LLLL.LLLLLLLLL.LLLLL...L.LL.LL.LLLLL.LLLLLLLL.LL.LLLL.L.LL.LLLLLL.LLLLLL
+LLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLL..LLLLL.LLLLLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLL
+L..LL...............L...L.......LLL.....LL...L.........L.....L...L..L.......L.LLLL..L.L..LL.LL....L
+LLLLLL.LLLLLLLLL.LLLLLL.LL.LLLL.LLLLLLLLL.LLLLLL.LLLLLL.LLLLLLL.LLL.LL.LLLLLLLLLLL.LLLLLLLLL.LLLLLL
+LLLLLL.LLLLLLLLLLLLLLLL.LL.LLLL.LLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLLL.LLLL.LLLLLL.LLLLL.LLL.LLLLLL
+LLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLL.LLLLLL.LLLLLLLLLLL..LLLLLLLLLLLLLLL
+.LLLLLLL.LLLLLLL.LLLLLLLLL..LLL.LLLLLLLLL..LLLLL.LLLLLLLL.LLLLL.LLLLLL.LLLL.L.L.LL..LLLLLLLL.L.LLLL
+LLLLLLLLLLLLLLLL.LLLLLLLLL.LLLL.LLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLL..LLLL.LLL.LL.LLLLLLLLL.LLLLLL
+LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLL.LLL.L.LLLLL.
+LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLL.LL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL..LLLLLLLLLLL.LLLLLLLLL.LLLLLL
+....L....L.L...L....L..L........L.L..LLL..L.L.L.L..L..L.....L.L....LL...LL..L..LL..LLL....LL...LL.L
+.LLLLLLLLLLLLLLL.LLLLLLLLL..LLLLLLLLL.LL..LLLLLL.L.LLLLLL.LLLLLLL.LLLL.LLLLLLLLLL..LLLLLLLLL.LLLLLL
+LLLLLL.LLLLLLLLL.LLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL...LLLL.LLLL.LLLLLLLLLL.LLLLLLLLLLLL
+LLLLLL.LLL.LLLLL.LLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLL.LLLLLL.LL.LLLLLLLLLLLLL
+LLLLLLLL.LLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.L.LLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLLL
+LLLLLLLLLLLLL.LLL.LLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLL.LLL.L..LLLLLLLLLLL.LLLLLLLLL.LLLLLL
+LLLLLLL.LLLLLL.L.LLLLLLLL.LLLLL.LLLLLLLLL.LLLLLL.LLLLL.LL.LLLLLLLL.LLL.LLLL.LLLLLL.LLLLLLLLL.LLLLLL
+LLLLLL.LLLLLLLLL.LLLLLLL.L.LLLL.LLLLLLLLL.LLLLLLLLLLL.LLL.LLLLL.LLLLLL.LLLL.LLLLLL.LLLLLLLLLLL.LLLL
+LLLLLL.LLLLLLLLL.LLLLLLLLL.L.LLL.LLLLLLLL.LLLLLL.LLLLLLLL.LLLLL.LLLLLL..LLLLLLLLLL.LL.LLLLLL.LLLLLL
+LLLLLL.LLLLLLLLL.L.LLLLLLL.LLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLL.LLL.LLLLLL.LLLL.LLLLLL.L.LLL.LLL.LLLLLL
+...........L...L.......L.LL...LL.L.L.L..L..L.L.LL.LLLL.LLL..LLL.L.L..L.L.LL.L..L....LLLLLL...L.....
+LLLL.L.LLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLL..L.LLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLL.L.L.LLLL
+LLLLLLLLLL..LLLL.LLLLLLLLL.LLLLLLLLLL.LLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLL.LLLLLL.LLLLLLLLL.L.LLLL
+LLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLL..LLLLLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLL.
+LL.LLLLLLLLLLLLL.LLLLLLLLL.LLL..LLLLLLLLLLLLLLLL.LLL.L.LL.LLLLL.LLLLLL.LLLL.LLLLLL.LLLL.LLLL.LLL.LL
+LLLLLL.LLLLLLLLL.LLLLLLLLL.LLLL.LLLLLLLLL..LLLLLLLLLLLLLL.LLLLL.LLLLLL.LLL.LLLLLLL.LLLLLLL.L.LLLLLL
+LLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLL.LLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLL
+L...LLLLL.L.L.L.L........L...L...L.LLL...L..LL.LLL.L..LL..........L.LL.LL......L.L.........LLL.LLL.
+LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL..LLLLL.LLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLL
+LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLL.LLLLLLLLL.LLLL.L.LLLLLL.L..LLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLL
+LLLL.L.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLL.LLLLLLLLLL.LLLLLL.L.LLLLLLLLLLLLLLLLLL..LLLLLL
+LLLLLL.LLLLLL..L.LLLLLLLLL.L.LL.LLLLLLLLL.LLLLLLLLLL.LLLL..LLLLLLLLLLL.LLLL.LLLL.L.LLLLLLLLLLLLLLLL
+LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LL..LLLLL.LLLLL.LLLLLLLLLLLLLL..LLLL.L.LLLLLLLLLLL.LLLLLLLLL.LLLLLL
+LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLL.LLLLLL.LLLLLLLLL.LLLLLL
+LLLLLLLLLLLLLLLL.LLLLLLLLL.LLLL.LLLLLLLLLLLLLLLL.LLLLLLLLL.LL.L.LL.LLL.LLLL.LLLLLLLLLLLLLLLL.LLLLLL
+L...LL.L.LL.LL..L.....L...L.L.L.L..LL....LL.L.L......L..L...L..LLL....LL.L.LLLL.L.LL.L..LLL.....L.L
+LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLL.L.LLLLLLLLLL
+.LLLLL.LLLLLLLLL.LLLLLLLLL.LL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLL
+LLLLLL.LL.LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLL
+LLLLLL..LLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL
+LLLLLL.LLLLLLLLL.LLLLL.LLL.LLLL.LLLLLLLLLLLLL.LLLLLLLL.LL.L.LLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLL.LLLLL.
+.L.......L....L.LL....L..L.......LL..L..L..L..LL..L...L......LLLL.L.......L.L.L...LL.LL.L.L...LLL..
+LLLLLL.L.LLLLLLL.LLLLLLLLLLL.LLLLL..LLLLL.LLLLLL.LLLLLLLL.LLLLL.LLLLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLL
+LLLLLL.LLLLLLLLL.LL.LLLLLLLLLLLLL..LLLLLL.LLLLLL.LLLLLLLL.LLLLL.LLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLL
+LLLLLL.LLLLLLLLL.LLLLLLLLL.L.LL.LLLLLLL.L.LLLLLL.LL..LLLL.LLLLLL.L.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL
+LLLLLL.L.L.LLLLL.LLLLLLLLLLLLLL.L.LLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.
+LLLLLL.LLLLLLLLLLL.LL.LLLL.LLLL.LLLLLLLLL.LLLLLL.LLLLLLLLLL.LLL.LLLLLL.LLLL.LLLLL..LLLLLLLLL.LLLLLL
+LLL..LLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLL..LLLLLLLLLLLLLLL
+LLLLLL.L.LLLLLLL.LLLLLLLLL..LLL.LLLLLLLLLLLL.LLLLLLLLLLLL.LLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLL
+.....LLL..........L.....L..L...LL.....LL...L...L.L....L..L.LL.L.L.LL.L.L.LLL.L.L.L..L.LL.L....LL...
+LLLLL..LLLLLLLLL.LLLLLLLLL.L.LLLLLLL.LLLL.LLLLLLLLLLLLLLLLLL.LL.LLLLLL.LLLL.LLLL.LLLLLLLL.LL.LLLLLL
+L.LLLL.LLLLLLLLL.LL.LLLLLL.LL.L..LLLLLLLL.LLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLL..LLLLL..LLLLLLLL.L.L.LL
+LL.LLLLLLLLLLLLL.LLLLLLLL.LLLLL.LLLLLLLLL.LLLLL.L.LLLLLLL.LLLLL.LLLLLL.LLLL.LLLLL..LLLLLLLLL.LLLLLL
+LLLLL..LLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLL.LLLLLL.LLLLLLLLLLLLLL.LLL.LL.LLLL.LLLLLL.LLLLLLLLL.LLLLLL
+LL.LLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLL.L.LLLLLL.LLLLL.LLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLL
+L.L.....LL........L..L....L.....LLL.L.L.L........L.........L........L..L..L..L.....L....LLL..L..LL.
+L.LLLL.LLL.LLLLLLL.LLLLLLL.LLLL.LLLLLLLLL.LLLLLL.LLLLLLL..LLLLL.LLLLLLLLLLLLLLLLL..LLLLLLL.L.LLLLLL
+LLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLL.L.LLLLLL.LLLL.LLLLLL.LLLLLLLLLLLLLLLL
+LLLLLL.LLLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLL...LLLL.LLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLLL
+LLLL.L.LL.L.LLLL.LLLLLLLLL.LLLL.LLLLLLLLL.LLLLLL.LLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLL.L.L.LLLL
+LL.L.L.L..L..L..L....L....L.L.LLL.L.LLL.......L..LL.....LLL......L.L.L.L..L.LLL...L.......L........
+LLLLLL.LLLLLLLLL.LLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLL.LLLLLL.LLLL.LLLLLL.LLLLLLLLL.LLLLLL
+LLLLLL.LLLLLLLLL.LL.LLLLLLLLLLLLLLL..LLLL.LLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL
+LLLLLL.LLLLLLL.L.L.LLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLL.LL.LLLLL.LLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLL
+LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLL.LLLLLL.LLLLL..LLLLLLLLLL.LLL.LLLL..LLLLL.LLLLLLL.LL.LLLLL
+LLLLLLLLLLLLLLLL.LLLL.LLLL.LLLLLLL.LLLLLL.LLLLLLLLLLLLLLL.LLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL
\ No newline at end of file
diff --git a/2020.csproj b/2020.csproj
index a655d06..91bf0f7 100644
--- a/2020.csproj
+++ b/2020.csproj
@@ -41,6 +41,9 @@
PreserveNewest
+
+ PreserveNewest
+
diff --git a/Program.cs b/Program.cs
index 82c9a70..7f47890 100644
--- a/Program.cs
+++ b/Program.cs
@@ -15,6 +15,7 @@
Q08.Go();
Q09.Go();
Q10.Go();
+ Q11.Go();
System.Diagnostics.Debug.WriteLine($"Total time={(System.DateTime.Now - start).TotalMilliseconds}ms");
}
}
diff --git a/Q11.cs b/Q11.cs
new file mode 100644
index 0000000..5cf2e33
--- /dev/null
+++ b/Q11.cs
@@ -0,0 +1,280 @@
+using System;
+using System.Diagnostics;
+using System.IO;
+
+namespace _2020
+{
+ class Q11
+ {
+ static SeatState[,] list = null;
+ static int numRows = 0;
+ static int numCols = 0;
+
+ enum SeatState
+ {
+ Floor,
+ Empty,
+ Occupied,
+ }
+
+ public static void Go()
+ {
+ var start = DateTime.Now;
+ MakeList();
+ Debug.WriteLine($"Q11 MakeList took {(DateTime.Now - start).TotalMilliseconds}ms");
+ var p1start = DateTime.Now;
+ Part1();
+ Debug.WriteLine($"Q11 part1 took {(DateTime.Now - p1start).TotalMilliseconds}ms");
+ var p2start = DateTime.Now;
+ Part2();
+ Debug.WriteLine($"Q11 part2 took {(DateTime.Now - p2start).TotalMilliseconds}ms");
+
+ Debug.WriteLine($"Q11 took {(DateTime.Now - start).TotalMilliseconds}ms");
+ }
+
+ static void MakeList()
+ {
+ var lines = File.ReadAllLines("11input.txt");
+ numRows = lines.Length;
+ numCols = lines[0].Length;
+
+ list = new SeatState[numRows, numCols];
+ for (int i = 0; i < numRows; i++)
+ {
+ for (int j = 0; j < numCols; j++)
+ {
+ list[i, j] = lines[i][j] == '.' ? SeatState.Floor : SeatState.Empty;
+ }
+ }
+ }
+
+ static int GetNumOccupiedAdjacent(SeatState[,] seatList, int row, int col)
+ {
+ int numOccupied = 0;
+ if (row - 1 >= 0)
+ {
+ if (col - 1 >= 0 && seatList[row - 1, col - 1] == SeatState.Occupied)
+ {
+ numOccupied++;
+ }
+ if (seatList[row - 1, col] == SeatState.Occupied)
+ {
+ numOccupied++;
+ }
+ if (col + 1 < numCols && seatList[row - 1, col + 1] == SeatState.Occupied)
+ {
+ numOccupied++;
+ }
+ }
+
+ if (col - 1 >= 0 && seatList[row, col - 1] == SeatState.Occupied)
+ {
+ numOccupied++;
+ }
+ if (col + 1 < numCols && seatList[row, col + 1] == SeatState.Occupied)
+ {
+ numOccupied++;
+ }
+
+ if (row + 1 < numRows)
+ {
+ if (col - 1 >= 0 && seatList[row + 1, col - 1] == SeatState.Occupied)
+ {
+ numOccupied++;
+ }
+ if (seatList[row + 1, col] == SeatState.Occupied)
+ {
+ numOccupied++;
+ }
+ if (col + 1 < numCols && seatList[row + 1, col + 1] == SeatState.Occupied)
+ {
+ numOccupied++;
+ }
+ }
+
+ return numOccupied;
+ }
+
+ static int GetNumOccupiedLOS(SeatState[,] seatList, int row, int col)
+ {
+ int numOccupied = 0;
+
+ Func checkSeat = (checkRow, checkCol) =>
+ {
+ if (seatList[checkRow, checkCol] == SeatState.Occupied)
+ {
+ numOccupied++;
+ return true;
+ }
+ if (seatList[checkRow, checkCol] == SeatState.Empty)
+ {
+ return true;
+ }
+
+ return false;
+ };
+
+ // ul
+ for (int checkRow = row - 1, checkCol = col - 1; checkRow >= 0 && checkCol >= 0; checkRow--, checkCol--)
+ {
+ if (checkSeat(checkRow, checkCol))
+ {
+ break;
+ }
+ }
+
+ // u
+ for (int checkRow = row - 1, checkCol = col; checkRow >= 0; checkRow--)
+ {
+ if (checkSeat(checkRow, checkCol))
+ {
+ break;
+ }
+ }
+
+ // ur
+ for (int checkRow = row - 1, checkCol = col + 1; checkRow >= 0 && checkCol < numCols; checkRow--, checkCol++)
+ {
+ if (checkSeat(checkRow, checkCol))
+ {
+ break;
+ }
+ }
+
+ // l
+ for (int checkRow = row, checkCol = col - 1; checkCol >= 0; checkCol--)
+ {
+ if (checkSeat(checkRow, checkCol))
+ {
+ break;
+ }
+ }
+
+ // r
+ for (int checkRow = row, checkCol = col + 1; checkCol < numCols; checkCol++)
+ {
+ if (checkSeat(checkRow, checkCol))
+ {
+ break;
+ }
+ }
+
+ // dl
+ for (int checkRow = row + 1, checkCol = col - 1; checkRow < numRows && checkCol >= 0; checkRow++, checkCol--)
+ {
+ if (checkSeat(checkRow, checkCol))
+ {
+ break;
+ }
+ }
+
+ // d
+ for (int checkRow = row + 1, checkCol = col; checkRow < numRows; checkRow++)
+ {
+ if (checkSeat(checkRow, checkCol))
+ {
+ break;
+ }
+ }
+
+ // dr
+ for (int checkRow = row + 1, checkCol = col + 1; checkRow < numRows && checkCol < numCols; checkRow++, checkCol++)
+ {
+ if (checkSeat(checkRow, checkCol))
+ {
+ break;
+ }
+ }
+
+ return numOccupied;
+ }
+
+ static void Part1()
+ {
+ SeatState[,] currState = new SeatState[numRows, numCols];
+ SeatState[,] nextState = new SeatState[numRows, numCols];
+ Array.Copy(list, currState, numRows * numCols);
+
+ int rounds = 0;
+ int totalNumOccupied = 0;
+ for (int numChanges = 0; rounds == 0 || numChanges != 0; rounds++)
+ {
+ Array.Copy(currState, nextState, numRows * numCols);
+
+ totalNumOccupied = 0;
+ numChanges = 0;
+
+ for (int i = 0; i < numRows; i++)
+ {
+ for (int j = 0; j < numCols; j++)
+ {
+ var numOccupied = GetNumOccupiedAdjacent(currState, i, j);
+ if (currState[i, j] == SeatState.Empty && numOccupied == 0)
+ {
+ nextState[i, j] = SeatState.Occupied;
+ numChanges++;
+ }
+ else if (currState[i, j] == SeatState.Occupied && numOccupied >= 4)
+ {
+ nextState[i, j] = SeatState.Empty;
+ numChanges++;
+ }
+
+ if (nextState[i, j] == SeatState.Occupied)
+ {
+ totalNumOccupied++;
+ }
+ }
+ }
+
+ Array.Copy(nextState, currState, numRows * numCols);
+ }
+
+ Debug.WriteLine($"Q11Part1: stabilized after {rounds - 1} rounds, total occupied={totalNumOccupied}");
+ }
+
+ static void Part2()
+ {
+ SeatState[,] currState = new SeatState[numRows, numCols];
+ SeatState[,] nextState = new SeatState[numRows, numCols];
+ Array.Copy(list, currState, numRows * numCols);
+
+ int rounds = 0;
+ int totalNumOccupied = 0;
+ for (int numChanges = 0; rounds == 0 || numChanges != 0; rounds++)
+ {
+ Array.Copy(currState, nextState, numRows * numCols);
+
+ totalNumOccupied = 0;
+ numChanges = 0;
+
+ for (int i = 0; i < numRows; i++)
+ {
+ for (int j = 0; j < numCols; j++)
+ {
+ var numOccupied = GetNumOccupiedLOS(currState, i, j);
+ if (currState[i, j] == SeatState.Empty && numOccupied == 0)
+ {
+ nextState[i, j] = SeatState.Occupied;
+ numChanges++;
+ }
+ else if (currState[i, j] == SeatState.Occupied && numOccupied >= 5)
+ {
+ nextState[i, j] = SeatState.Empty;
+ numChanges++;
+ }
+
+ if (nextState[i, j] == SeatState.Occupied)
+ {
+ totalNumOccupied++;
+ }
+ }
+ }
+
+ Array.Copy(nextState, currState, numRows * numCols);
+ }
+
+ Debug.WriteLine($"Q11Part2: stabilized after {rounds - 1} rounds, total occupied={totalNumOccupied}");
+ }
+ }
+}