bool IsGroupSeparable(bool[,] peopleRelations, int N)
var seatMap = new byte[N]; byte anySide = 0; byte leftSide = 1; byte rightSide = 2;
bool trySeatAllAcquintances(int firstFellow)
int[] stackFellowsToCheck = new int[N]; int iStack = -1;
stackFellowsToCheck[++iStack] = firstFellow;
int fellow = stackFellowsToCheck[iStack--];
byte sideForFriendsOfFriend = seatMap[fellow];
byte requiredSideForDirectFriends = sideForFriendsOfFriend == leftSide ? rightSide : leftSide;
for (int friend = firstFellow; friend < N; friend++)
if (peopleRelations[fellow, friend])
peopleRelations[fellow, friend] = peopleRelations[friend, fellow] = false;
var sideOfFriend = seatMap[friend];
if (sideOfFriend == anySide)
seatMap[friend] = requiredSideForDirectFriends;
stackFellowsToCheck[++iStack] = friend;
if (sideOfFriend != requiredSideForDirectFriends)
for (passenger = 0; passenger < N - 1; passenger++)
if (seatMap[passenger] != anySide)
seatMap[passenger] = leftSide;
if (!trySeatAllAcquintances(passenger))
public static void Main()
{false, true , false, true },
{true , false , true , false},
{false, true , false, true },
{true , false , true , false},
{false, true , false, true , false},
{true , false , false, false , false},
{false, false , false, true , true },
{true , false , true , true , true },
{false, false , true , true , false},
{false, true , false, true , false, false, false },
{true , false, true , false, false, false, false },
{false, true , false, true , false, true , false },
{true , false, true , false, false, false, false },
{false, false, false, false, false, false, true },
{false, false, true , false, false, false, true },
{false, false, false, false, true , true , false },
{false, false, true, false },
{false, false, false, true },
{true , false, false, true },
{false, true , true, false },
{false, false, true, true },
{false, false, false, true },
{true , false, false, true },
{true , true , true , false},
Test(cycleLength % 2 == 0, GenLargestCycle(cycleLength));
Test(cycleLength % 2 == 0, GenLargestCycle(cycleLength));
static void Test(bool expectedResult, bool[,] peopleRelations) {
int N = peopleRelations.GetLength(0);
bool result = IsGroupSeparable(peopleRelations, N);
Console.WriteLine("N = "+ N +" / Expected : "+expectedResult.ToString().PadRight(5)+" / Actual : "+ result.ToString().PadRight(5) + " / " + (expectedResult == result ? "PASS" : "FAIL"));
static bool[,] GenLargestCycle(int N) {
var result = new bool[N, N];
for (int i = 0; i < N-1; i++) {
result[i, i + 1] = result[i + 1, i] = true;
result[0, N - 1] = result[N - 1, 0] = true;