void AddToGroup(GroupOfStones group, Stone stone) { if (stone == null) { return; // stone is null } if (stone.inGroup) { return; // stone is already in a group } if (stone.val == 0) { group.AddLiberty(stone); return; // open space (liberty) } int x = stone.x; int y = stone.y; int z = stone.z; if (group.AddStone(stone)) { AddToGroup(group, GetStoneAt(x + 1, y, z)); AddToGroup(group, GetStoneAt(x - 1, y, z)); AddToGroup(group, GetStoneAt(x, y + 1, z)); AddToGroup(group, GetStoneAt(x, y - 1, z)); AddToGroup(group, GetStoneAt(x, y, z + 1)); AddToGroup(group, GetStoneAt(x, y, z - 1)); } }
List <GroupOfStones> FindAllGroups() { foreach (Stone stone in data) { stone.inGroup = false; } List <GroupOfStones> groups = new List <GroupOfStones>(); foreach (Stone stone in data) { GroupOfStones group = MakeGroup(stone); if (group != null && group.stones.Count > 0) { groups.Add(group); } } return(groups); }
GroupOfStones MakeGroup(Stone stone) { if (stone == null) { return(null); // stone is null } if (stone.inGroup) { return(null); // stone is already in a group } if (stone.val == 0) { return(null); // open space (liberty) } GroupOfStones group = new GroupOfStones(stone.val); AddToGroup(group, stone); return(group); }