public IEnumerable<int> GetSolution(IEnumerable<int> opened, IList<Chest> toopen, KeySet keyset)
{
if (toopen.Count() == 0)
return opened;
foreach (var chest in toopen.Where(ch => !this.keys.Keys.Contains(ch.Key)))
{
var newset = keyset.Remove(chest.Keys);
if (!newset.Keys.Contains(chest.Key))
return null;
}
foreach (var chest in toopen.Where(ch => ch.Opener == -1 && this.keys.Keys.Contains(ch.Key)))
{
int key = chest.Key;
var result = new List<int>(opened);
result.Add(this.chests.IndexOf(chest));
chest.Open();
chest.Opener = 0;
var oldkeys = this.keys;
this.keys = this.keys.Remove(key);
this.keys = this.keys.Add(chest.Keys);
var newtoopen = new List<Chest>(toopen);
newtoopen.Remove(chest);
var newkeyset = keyset.Remove(chest.Keys);
var newresult = this.GetSolution(result, newtoopen, newkeyset);
if (newresult != null)
return newresult;
chest.Close();
this.keys = oldkeys;
}
return null;
}