Seen verbinden
-
Hallo,
ich hab hier eine Problemstellung bei der ich nicht weis wie ich sie lösen soll. Es geht darum eine Reihe von Seen mit Kanälen zu verbinden. Als Eingabe gibt es ein 2D Array, in etwa wie folgt
11100001 10100011 10000000 00011001
Alle zusammenhängende 1sen bilden einen See. So nun soll man alle Seen verbinden und dabei möglichst wenige Kanäle graben. Man darf überall wo eine 0 ist ein Kanal graben und 2 Seen gelten als verbunden wenn man sich horizental oder vertikal über Seen und Kanäle von einem See zum anderen bewegen kann.
Es kann mehere Lösungen geben. Beispiel:
11100001 10122211 10002002 00011001
aber auch
11100001 10100011 10200002 00211221
haben jedesmal eine Kanallänge von 5. Gefragt ist allerdings nur die minimale Kanallänge, also bei diesem Beispiel 5, und nicht die genauen Positionen der Kanäle.
Ich bin für jede Hilfe dankbar.
-
Hm, als erstes würde ich mir eine Struktur für die seen machen,
die jeweils einen see abbilden:struct pos { int x,y; } class see { std::set<pos> positionen; }
Dann musst du halt noch jeweils dein array durchgehen,
und feststellen ob die 1 die du gefunden hast, schon zu einem
See gehört, wenn nein -> neuen See erstellen, und alle angrenzenden
1 solange eintragen, bis er erfasst ist.Dann musst du nur noch für jeden See zu jedem Nachbar see
die kürzeste Verbindung herausfinden...Devil
-
Und achte auf Folgendes: Wenn Du zwei Seen verbunden hast, musst Du sie "verschmelzen", also sie nur noch wie einen einzigen See behandeln, zu dem auch die Verbindungsfelder gehören. Dann kann's nämlich auch "Wegkreuzungen" geben.
Es gab mal einen PHP-Coding-Contest, in dem fast genau diese Aufgabe gestellt wurde. Man konnte nachher auch die Codes der Teilnehmer runterladen.
-
Mir ist noch nicht klar wie ich das angehen soll. Wie ich die einzeln 1sen zu einem See zusammen fügen kann ist mir klar, wie ich den kürzesten Weg zwischen 2 Seen suche auch, allerdings danach stehe ich auf dem Schlauch.
Was mir auch nicht klar ist wie ich den Weg zwischen einem See und einem "verschmelzten" See suchen soll. Es ist ja gut möglich, dass es mehrere gleiche gute Möglichkeiten gibt 2 Seen zu verschmelzen welche allerdings unterschiedlich abschneiden können wenn ich den Weg suche.
EDIT: Ich hab ein paar Rechtschreibfehler verbessert.
-
devil81 schrieb:
Dann musst du nur noch für jeden See zu jedem Nachbar see
die kürzeste Verbindung herausfinden...
Devilglaub ich nicht.
das würde ja aus
* * * *
sowas
*-* |X| *-*
machen. dabei reicht
*-* | *-*
wenn man von jedem see zu jedem anderen weiß, wieviele löcher man für diese verbindung buddeln müßte, könnte man fast versuchen, unter "minimaler spannbaum" oder so einen algo im netz zu suchen.
ist aber nicht so einfach, weil sobald ein kanal zwischen zwei seen geschaufelt wurde, alle anderen kanalkosten betroffen sein könnten.
mir fällt im moment nix besseres als bruteforcen ein, um ganz sicher zu gehen.
-
volkard schrieb:
devil81 schrieb:
Dann musst du nur noch für jeden See zu jedem Nachbar see
die kürzeste Verbindung herausfinden...
Devilglaub ich nicht.
das würde ja aus
* * * *
sowas
*-* |X| *-*
machen. dabei reicht
*-* | *-*
wenn man von jedem see zu jedem anderen weiß, wieviele löcher man für diese verbindung buddeln müßte, könnte man fast versuchen, unter "minimaler spannbaum" oder so einen algo im netz zu suchen.
ist aber nicht so einfach, weil sobald ein kanal zwischen zwei seen geschaufelt wurde, alle anderen kanalkosten betroffen sein könnten.
mir fällt im moment nix besseres als bruteforcen ein, um ganz sicher zu gehen.
Ich wollte nur nicht weiter ins Detail gehen.
Natürlich würde man dann die kürzeste wegstrecke mit allen seen drin suchen müssen.Devil
-
volkard schrieb:
dabei reicht
*-* | *-*
Reichen würde sogar schon
* * X * *
-
Das geht nicht da Kanäle nur horizental oder vertikal sein dürfen.
-
Achso, dann wirst Du mit den Einsendungen vom PHP-Contest wohl leider doch nicht so viel anfangen können.