bool InRange(Place place) { if (place.x < 0 || place.x >= w) return false; if (place.y < 0 || place.y >= h) return false; if (map[place.x, place.y] != ' ') return false; return true; }
public string MoveAlfa(Place start, Place finish) { Queue<Brain> queue = new Queue<Brain>(); // очередь для организации алгоритма поиска вширину List<Place> visited = new List<Place>(); // список вершин, гду мы уже были queue.Clear(); visited.Clear(); Brain brain; brain.x = start.x; brain.y = start.y; brain.path = ""; Place place; queue.Enqueue(brain); while (queue.Count > 0) { brain = queue.Dequeue(); foreach (Brain side in directions) { place.x = brain.x + side.x; place.y = brain.y + side.y; if (!InRange(place)) continue; if (visited.Contains(place)) continue; visited.Add(place); Brain step = new Brain(place, brain.path + side.path); if (place.Equals(finish)) return step.path; queue.Enqueue(step); } } return ""; }
public string MoveAbox(Place mouse, Place start, Place finish) { // mouse - где находится мышка, // start - где находится ящик, // finish - куда поместить ящик if (start.x == finish.x && start.y == finish.y) return ""; map[start.x, start.y] = ' '; bool[, , ,] visited = new bool[w, h, w, h]; Queue<Brain> queue = new Queue<Brain>(); // очередь для организации алгоритма поиска вширину // Dictionary<MouseAbox, bool> visited = new Dictionary<MouseAbox, bool>(); // список положения мышки и ящика, гду мы уже были queue.Clear(); //visited.Clear(); Brain brain; brain.mouse = mouse; brain.abox = start; brain.path = ""; Place newMouse; Place newAbox; queue.Enqueue(brain); while (queue.Count > 0) { brain = queue.Dequeue(); foreach (Dirs side in directions) { newMouse.x = brain.mouse.x + side.x; newMouse.y = brain.mouse.y + side.y; if (!InRange(newMouse)) continue; if (newMouse.x == brain.abox.x && newMouse.y == brain.abox.y) { newAbox.x = newMouse.x + side.x; newAbox.y = newMouse.y + side.y; if (!InRange(newAbox)) continue; } else newAbox = brain.abox; // MouseAbox ma; // для работы со списком Dictionary //ma.mouse = newMouse; //ma.abox = newAbox; //if (visited.ContainsKey(ma)) // continue; //visited.Add(ma, false); if (visited[newMouse.x, newMouse.y, newAbox.x, newAbox.y]) continue; visited[newMouse.x, newMouse.y, newAbox.x, newAbox.y] = true; Brain step = new Brain(newMouse, newAbox, brain.path + side.path); if (newAbox.x == finish.x && newAbox.y == finish.y) return step.path; queue.Enqueue(step); } } return "NO"; }
public Brain(Place mouse, Place abox, string p) { this.mouse = mouse; this.abox = abox; path = p; }
public Brain(Place place, string p) { this.x = place.x; this.y = place.y; path = p; }