Rechtwinklige Dreiecke

Hallo!
Hier was für alle Knobler…

Gegeben sei eine Matrix. Jedes Feld dieser Matrix kann den Wert 0 oder 1 annehmen.
1 bedeutet „Punkt“
0 bedeutet „kein Punkt“

Bsp: 2x2 Matrix

1 1
1 1

Aufgabe soll es sein, alle rechtwinkligen Dreiecke, die sich durch Kombination verschiedener Punkte ergeben können, zu finden.

In unserem Beispiel sind das 4 Stück.

Anderes Beispiel:

3 x 3 Matrix

1 0 1
0 0 1
1 1 1

Nur „1“ können miteinander verbunden werden!

Meine Frage:

Gibt es eine mathematische Lösung, um die Anzahl der möglichen Dreiecke zu berechnen.

  • für eine beliebig große Matrix mit wahllos verteilten Punkten

mfg Tobi

OwT: nein, gibt´s nicht
nein

ok, gibt es dann vielleicht einen Algorithmus, oder ein System, wie man am besten vorgeht.

Ziel ist es ein Programm zu schreiben, dass die Anzahl der Dreiecke liefert

mfg Tobi

ok, gibt es dann vielleicht einen Algorithmus, oder ein
System, wie man am besten vorgeht.

Ziel ist es ein Programm zu schreiben, dass die Anzahl der
Dreiecke liefert

naja das problem liegt darin, das man nicht wiess wieviele zahlen insgesamt sind, also brauchst du ein dynamisches system (für das programm), und das problem liegt darin das wenn die matrix zb. so auschaut:

(1)0 1 0 0 1 1 1 0 1 1 0 1 0 1 0 
 0 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1 
 0 1 1 0 1 1 0 0 1 1 0 1 1 0 1 0 
 1 0 1 1 0 1 1 0 1 1 1 0 1 0 0 1 
 1 0 0 1 1 0 1 0 1 0 1 0 0 0 1 0 
 1 0 1 0 0 0 1 0 0 0 1 0 1 1 1 0 
 1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0
 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1
 1 0 1 0 0 1 0 0 1 0 1 0 1 0 1 0
 1 0 1 0 0 1 1 1 0 1 1 0 1 0 1 0 
 0 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1
 0 1 1 0 1 1 0 0 1 1 0 1 1 0 1 0
 1 0 1 1 0 1 1 0 1 1 1 0 1 0 0 1
 1 0 0 1 1 0 1 0 1 0 1 0 0 0 1 0
 1 0 1 0 0 0 1 0 0 0 1 0 1 1 1 0
(1)1 1 0 0 1 0 0 0 0 0 0 0 0 0(1)

die in Klammer ergeben ein rechtwinkeliges dreieck, aber der der einen Eins (links unten) würde es wieder ne möglichkeit geben, gleich nebenan … also welches nimmst du ?

mfg Tobi

ok, gibt es dann vielleicht einen Algorithmus, oder ein
System, wie man am besten vorgeht.

Ziel ist es ein Programm zu schreiben, dass die Anzahl der
Dreiecke liefert

Gehe die Matrix eine Position nach der anderen durch. Bei jeder „1“ suchst du (a) alle anderen Einsen in der gleichen Zeile und (b) alle anderen Einsen in der gleichen Spalte. (a)*(b) liefert die Anzahl aller rechtwinkligen Dreiecke, die an der gerade betrachteten „1“ ihren rechten Winkel haben. So zählst Du auch nix doppelt.

Gruß, Ralf

Hallo,
das Dreieck ist doch eindeutig durch drei Punkte festgelegt oder seh’ ich da etwas falsch ?

Gruss
Enno

naja das problem liegt darin, das man nicht wiess wieviele
zahlen insgesamt sind, also brauchst du ein dynamisches system
(für das programm), und das problem liegt darin das wenn die
matrix zb. so auschaut:

(1)0 1 0 0 1 1 1 0 1 1 0 1 0 1 0
0 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1
0 1 1 0 1 1 0 0 1 1 0 1 1 0 1 0
1 0 1 1 0 1 1 0 1 1 1 0 1 0 0 1
1 0 0 1 1 0 1 0 1 0 1 0 0 0 1 0
1 0 1 0 0 0 1 0 0 0 1 0 1 1 1 0
1 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0
1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1
1 0 1 0 0 1 0 0 1 0 1 0 1 0 1 0
1 0 1 0 0 1 1 1 0 1 1 0 1 0 1 0
0 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1
0 1 1 0 1 1 0 0 1 1 0 1 1 0 1 0
1 0 1 1 0 1 1 0 1 1 1 0 1 0 0 1
1 0 0 1 1 0 1 0 1 0 1 0 0 0 1 0
1 0 1 0 0 0 1 0 0 0 1 0 1 1 1 0
(1)1 1 0 0 1 0 0 0 0 0 0 0 0 0(1)

die in Klammer ergeben ein rechtwinkeliges dreieck, aber der
der einen Eins (links unten) würde es wieder ne möglichkeit
geben, gleich nebenan … also welches nimmst du ?

mfg Tobi

Das ist richtig, aber es geht ja darum alle möglichkeiten zu finden.

Dein Bsp:

(1)0 1 0 0 1 1 1 0 1 1 0 1 0 1 0
0 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1
0 1 1 0 1 1 0 0 1 1 0 1 1 0 1 0
1 0 1 1 0 1 1 0 1 1 1 0 1 0 0 1
1 0 0 1 1 0 1 0 1 0 1 0 0 0 1 0
[1]0 1 0 0 0 1 0 0 0 1 0 1 1 1 0
[1]1 1 0 0 1 0 0 0 0 0 0 0 0 0 0
[1]0 1 0 1 0 0 1 0 1 0 1 0 1 0 1
1 0 1 0 0 1 0 0 1 0 1 0 1 0 1 0
1 0 1 0 0 1 1 1 0 1 1 0 1 0 1 0
0 1 0 0 1 1 0 1 0 1 0 1 0 1 0 1
0 1 1 0 1 1 0 0 1 1 0 1 1 0 1 0
1 0 1 1 0 1 1 0 1 1 1 0 1 0 0 1
1 0 0 1 1 0 1 0 1 0 1 0 0 0 1 0
1 0 1 0 0 0 1 0 0 0 1 0 1 1 1 0
(1)1 1 0 0 1 0 0 0 0 0 0 0 0 0(1)

Z.B. würden auch die 1 in [] in Kombination mit deinen (1) links und rechts unten wieder ein r. Dreieck ergeben.

Das Problem sind aber weniger die Dreiecke die leicht zu erkennen sind, sondern solche die schräg liegen

Bsp

0 0 0 1 0 0
0 0 0 0 0 0
0 0 0 0 0 1
1 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0

nop, das stimmt so nicht, was ist mit denen die schräg zueinander rechtwinkelig sind ?

bsp:

0 0 0 1 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
1 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 1 0 0 0

das würde nach deiner beschreibung gerade mal ne Gerade finden, das ist ja das problem ^^

mfg, esi

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Stümpt, der Algorithmus findet nur Dreiecke mit einer waagerechten und einer senkrechten Kante. An die schräg liegenden Dreiecke hatte ich nicht gedacht.

Nu, machen wir es so:
Wir interpretieren die Zeilen- und Spaltenpositionen in der Matrix als kartesische Koordinaten.
Dann betrachten wir alle Tripel von Einsen in der Matrix. Ein Tripel liege an den Positionen P, Q und R. Dann testen wir, ob die Vektoren P->Q und P->R senkrecht aufeinander stehen (Skalarprodukt). Wenn ja, haben wir ein rechtwinkliges Dreieck mit rechtem Winkel bei P.
Die Schleifen so zu gestalten, dass keine Dreiecke doppelt gezählt werden, bleibt dem interessierten Leser zur Übung überlassen :smile:.

Gruß, Ralf

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Stümpt, der Algorithmus findet nur Dreiecke mit einer
waagerechten und einer senkrechten Kante. An die schräg
liegenden Dreiecke hatte ich nicht gedacht.

Nu, machen wir es so:
Wir interpretieren die Zeilen- und Spaltenpositionen in der
Matrix als kartesische Koordinaten.
Dann betrachten wir alle Tripel von Einsen in der Matrix. Ein
Tripel liege an den Positionen P, Q und R. Dann testen wir, ob
die Vektoren P->Q und P->R senkrecht aufeinander stehen
(Skalarprodukt). Wenn ja, haben wir ein rechtwinkliges Dreieck
mit rechtem Winkel bei P.
Die Schleifen so zu gestalten, dass keine Dreiecke doppelt
gezählt werden, bleibt dem interessierten Leser zur Übung
überlassen :smile:.

Gruß, Ralf

ähm , ja, ich hab das jetzt mal nur schnell runtergelesen was du gechrieben hast, aber ich glaube ich hätte eine möglichkeit … ich könnte es in C/C++ schreiben (obwohl ich fast nichts kann, vom programmeiren her), nur hab ich keine lust, und keine zeit, aber ich könnte dir ja aufschreiben auf was du achten musst:

1.) von pos 1-1 bis pos x-x(also von links oben nach rechts unten in der matrix), nacheinander jede stelle überprüfen und wenn eine „1“ gefunden wurde, position dieser „1“ merken.

2.) zeilen spalten vergleichen (aber nicht nur einmal, wir wollen ja ALLE möglichkeiten haben)

3.) dann von der position dieser 1, (jetzt wirds kompliziert, ich versuche es bildlich darzustellen), eine zeile nach unten ( zwei variablen definieren, die eine bei jedem durchlauf der schleife +1 die andere -1), wenn keine „1“ gefunden wurde, wieder ne zeile runter , wieder +1 -1 der beiden variablen usw. usw.

zeichnung um zahl schräg zu finden:

Legende: (1) dreieck
[0] die zahl die überprüft wird im moment

(1)0 0 0 0 0 0 0 
 0[0]0 0 0 0 0 0 

Hallo,
das Brute-Force Verfahren mit O(N^3) wäre es, für jede „1“ zu bestimmen Eckpunkt von wieviel rechtwinkligen Dreiecken es ist, dann diese Werte summieren und durch 3 zu teilen. Für eine dünnbesetzte Matrix kann das aber durchaus effizient sein, man orientiert sich ja an den "1"ern. Der Test auf Rechtwinkligkeit für zwei Vektoren (a,b) und (c,d) ergibt sich einfach zu |a*c|=|b*d| (|.| Betrag).

Gruss
Enno

hier nur ein rätsel:

was ist braun und dreht sich? :smile:

Ein Tanzbär ??

Gruß *g* Peter

OffTopic
Du weist aber, dass Du auch bei richtiger Lösung für 0.49€ nur einen kurzen Flirt mit einer Frauenstimme hast!

Trotzdem viel Spaß

achim

Hallo Achim!

Hab’s nicht kappiert!
Sorry!

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Tobi,

ein derartiges Programm ist ausgezeichnet dazu in der Lage, die wirklich kniffligen 1000Euro-Rätsel bei 9-live zu lösen. Aber ob die Antwort richtig ist oder nicht, jeder Anruf bringt 49Cent in Sender- und Telekom-kasse, und 99,9999999999999% der Anrufer höhren eine Frauenstimme mit „Leider Verloren, aber beim nächsten mal…“

Gruß Achim

P.S. Bist Du sicher, dass Du nur einfach soooo die Idee zu diesem Alogrithmus hattest?

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Erleuchtung
Hallo,

ein derartiges Programm ist ausgezeichnet dazu in der Lage,
die wirklich kniffligen 1000Euro-Rätsel bei 9-live zu lösen.

die kenn’ ich zwar nicht aber vielleicht kannst Du ja mal näher beleuchten, inwiefern sich viele Rätsel auf Tobis Problem reduzieren lassen. Ein Programm zur Lsg. mit kubischer Laufzeit ist schnell geschrieben.

Gruss
Enno

Der Test auf Rechtwinkligkeit für zwei Vektoren (a,b) und (c,d) ergibt sich
einfach zu |a*c|=|b*d| (|.| Betrag).

Korrekter ist a*c=-b*d.

Gruss
Enno

die kenn’ ich zwar nicht aber vielleicht kannst Du ja mal
näher beleuchten, inwiefern sich viele Rätsel auf Tobis
Problem reduzieren lassen. Ein Programm zur Lsg. mit kubischer
aufzeit ist schnell geschrieben.

Hallo Enno,

also das mit den Rechtwinkligen Dreiecken wird dort (bei 9-Live) GENAU SO gespielt, ab und zu. Es ist ein ca. 10x10 großes Feld von Punkten, wobei nur ca. 30 wirklich da sind, und die Frage ist, wieviel Rechtwinklige Dreiecke sich bilden lassen. Ander Figuren bestehen aus linien, fragen nach Dreiecken egal welcher Form, oder oder oder…

Andere Fragen möchten den Vornamen des Bundeskanzlers wissen (oder so) die sind genauso dotiert. Vermutlich kommen bei kniffligen Rätseln (wo auch die ersten 20 Zuschauer ca. 10 Dreiecke zählen, wo 50 zu finden sind) manche auf die IDEE: "Das weiss keiner, nur ich, jetzt rufe ich an! "

Für weniger als 10.000 Anrufe pro Rätsel tun die sicherleich keine 1000 Euro raus. Da ist es relativ egal, ob Du die Lösung hast oder nicht.

Gruss
Enno

… richtig :=)

Hallo,

ein sehr nettes Problem. Da hatte ich doch gleich mal Lust ein kleines Tool in Flash zu bauen, mit dem man das lösen und rumprobieren kann:

http://www.quasimondo.com/flashforum/trianglefinder.php

Ich hoffe, es sind keine Fehler mehr drin.

Viel Spaß damit
Mario