public void Load() { int counter = 0; int c; setWalls(); while (counter < sizeX * sizeY) { c = Reader.Read(); if (!allowedChars.Contains((char)c)) { continue; } switch (c) { case 'S': sk = new MoveableObject(counter % sizeX + 1, counter / sizeX + 1); break; case 'B': box = new MoveableObject(counter % sizeX + 1, counter / sizeX + 1); break; } plan[counter % sizeX + 1, counter / sizeX + 1] = c; counter++; } }
public int Solve() { int[, , ,] wasIHere = new int[sizeX + 1, sizeY + 1, sizeX + 1, sizeY + 1]; Queue <MoveableObject> queueSk = new Queue <MoveableObject>(); Queue <MoveableObject> queueBox = new Queue <MoveableObject>(); queueSk.Enqueue(sk); queueBox.Enqueue(box); while (queueSk.Count != 0) { MoveableObject skQueued = queueSk.Dequeue(); MoveableObject boxQueued = queueBox.Dequeue(); int previous = wasIHere[skQueued.x, skQueued.y, boxQueued.x, boxQueued.y]; for (int i = 0; i < vectors.Length / 2; i++) { sk = skQueued.Clone(); box = boxQueued.Clone(); sk.Move(vectors[i, 0], vectors[i, 1]); if (sk.x == box.x && sk.y == box.y) { box.Move(vectors[i, 0], vectors[i, 1]); } if (plan[sk.x, sk.y] == 'X' || plan[box.x, box.y] == 'X') { continue; } if (plan[box.x, box.y] == 'C') { return(previous + 1); } if (wasIHere[sk.x, sk.y, box.x, box.y] != 0) { continue; } wasIHere[sk.x, sk.y, box.x, box.y] = 1 + previous; queueSk.Enqueue(sk.Clone()); queueBox.Enqueue(box.Clone()); } } return(-1); }
public void Load() { int counter = 0; int c; setWalls(); while (counter < sizeX * sizeY) { c = Reader.Read(); if (!allowedChars.Contains((char)c)) continue; switch (c) { case 'S': sk = new MoveableObject(counter % sizeX + 1, counter / sizeX + 1); break; case 'B': box = new MoveableObject(counter % sizeX + 1, counter / sizeX + 1); break; } plan[counter % sizeX + 1, counter / sizeX + 1] = c; counter++; } }
public int Solve() { int[, , ,] wasIHere = new int[sizeX + 1, sizeY + 1, sizeX + 1, sizeY + 1]; Queue<MoveableObject> queueSk = new Queue<MoveableObject>(); Queue<MoveableObject> queueBox = new Queue<MoveableObject>(); queueSk.Enqueue(sk); queueBox.Enqueue(box); while (queueSk.Count != 0) { MoveableObject skQueued = queueSk.Dequeue(); MoveableObject boxQueued = queueBox.Dequeue(); int previous = wasIHere[skQueued.x, skQueued.y, boxQueued.x, boxQueued.y]; for (int i = 0; i < vectors.Length / 2; i++) { sk = skQueued.Clone(); box = boxQueued.Clone(); sk.Move(vectors[i, 0], vectors[i, 1]); if (sk.x == box.x && sk.y == box.y) box.Move(vectors[i, 0], vectors[i, 1]); if (plan[sk.x, sk.y] == 'X' || plan[box.x, box.y] == 'X') continue; if (plan[box.x, box.y] == 'C') return previous + 1; if (wasIHere[sk.x, sk.y, box.x, box.y] != 0) continue; wasIHere[sk.x, sk.y, box.x, box.y] = 1 + previous; queueSk.Enqueue(sk.Clone()); queueBox.Enqueue(box.Clone()); } } return -1; }