Autor |
Beitrag |
DorJo
      
Beiträge: 139
|
Verfasst: Do 28.02.08 15:47
Hy @ all,
ich bins mal wieder
Ich habe folgendes Problem: Ich habe einen zweidimensionalen Array [1..8,1..8]. Ein beliebiges Feld [x,y] des Arrays hat den Wert 3. Ich suche einen Algorithmus mit dem ich die schrägen um dieses Feld [x,y] überprüfen kann, aber mir fällt einfach nichts sinnvolles ein!
Allgemein muss man meiner Ansicht nach ja 3 verschiedene Fälle betrachten:
1) x=y ~~> Schräge von links nach rechts:
Delphi-Quelltext 1: 2: 3: 4:
| for i:=1 to 8 do begin array[i,i]-->überprüfen end; |
~~> aber wie kann ich zum Beispiel die schräge von rechts nach links überprüfen?
2) x>y (nach rechts verschoben) ~~> keine Ahnung
3) x<y (nach unten verschon) ~~> auch keine Ahnung
ich würde mich sehr über Vorschläge freuen
und danke schon mal im Voraus!
MfG
Dor JO
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Do 28.02.08 15:50
Meinst du sowas?
Delphi-Quelltext 1: 2: 3: 4:
| for i:=1 to 8 do begin array[8-i+1, i]-->überprüfen end; |
_________________ We are, we were and will not be.
|
|
Kroko
      
Beiträge: 1284
W98 W2k WXP
Turbo D
|
Verfasst: Do 28.02.08 15:50
wenn es bei beliebigen (x;y) los geht, dann
Diagonale 1 ((x+i) mod 8;(y+i) mod 8 )
Diagonale 2 ((x-i) mod 8;(y+i) mod 8 )
_________________ Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
Zuletzt bearbeitet von Kroko am Do 28.02.08 16:01, insgesamt 1-mal bearbeitet
|
|
DorJo 
      
Beiträge: 139
|
Verfasst: Do 28.02.08 15:54
WOW
Danke für die superschnellen Antworten
@Gausi: ja genausowas mein ich
@Kroko: das versteh ich nicht! Könntest du das bitte ein bisschen genauer erklären?! 
|
|
Kroko
      
Beiträge: 1284
W98 W2k WXP
Turbo D
|
Verfasst: Do 28.02.08 16:04
Ja, die Diagonale1 geht nach rechts unten, Diagonale2 geht nach links unten, das Ganze in Schleife für I von 1 bis 8 und da hast die Koordinaten der 1. und 2. Diagonale, meine Schreibweise ist die Punktschreibweise aus der Mathematik Klasse 3 oder 4, 
_________________ Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Do 28.02.08 16:12
Hallo,
das riecht nach dem n-Damen Problem siehe Nikolaus Wirth mit Überprüfung der Diagonalen oder div und mod und haste nicht gesehen...
aja, da war es doch: www.delphi-forum.de/viewtopic.php?p=440863
Gruß Horst
Anschaulich:
Diagonale von links unten A1 x,y 1|1 nach rechts oben H8 x,y 8|8 wird zu
das HauptDiagonale [0] =HauptDiagonale [x-y] mit HauptDiagonale= array[-7..+7] of Boolean;
Diagonale von rechts unten A8 x,y 1|8 nach links oben H1 x,y 8|1 wird zu
das Nebendiagonale [9] =HauptDiagonale [x+y] mit NebenDiagonale= array[2..16] of Boolean;
|
|
DorJo 
      
Beiträge: 139
|
Verfasst: Do 28.02.08 19:12
Hmm
@Kroko: Das funktioniert leider nicht der Algorithmus
Ich hab aus deiner Beschreibung folgenden Code gemacht:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| var i, x, y: integer; begin x:=strtoint(Edit1.Text); y:=strtoint(Edit2.Text); Memo1.Lines.Add('Diagonale nach rechts unten:'); for i:=1 to 8 do begin Memo1.Lines.Add(inttostr(((x+i) mod 8))+',' + inttostr(((y+i) mod 8))); end; Memo1.Lines.add('Diagonale nach links unten:'); for i:=1 to 8 do begin Memo1.Lines.Add(inttostr(((x-i) mod 8))+',' + inttostr(((y+i) mod 8))); end; |
und da kommt bei x=4 und y=2:
Diagonale nach rechts unten:
5,3
6,4
7,5
0,6
1,7
2,0
3,1
4,2
Diagonale nach links unten:
3,3
2,4
1,5
0,6
-1,7
-2,0
-3,1
-4,2
richtig wäre aber:
rechts unten:
3,1
5,3
6,4
7,5
8,6
Links unten:
1,5
2,4
3,3
5,1
~~> die 1,7 stimmt nicht und die 5,1 fehlt
weißt du woran das liegen könnte?
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Do 28.02.08 19:30
Hallo,
zum Verständnis wie man die Diagonalen abfragen kann:
Eine Seite mit passendem Namen; Delphi for fun ...
www.delphiforfun.org.../EightQueensPlus.htm
|
|
Kroko
      
Beiträge: 1284
W98 W2k WXP
Turbo D
|
Verfasst: Do 28.02.08 20:55
(1) ja, bei mir geht das Array von 0..7, bei dir von 1 bis 8, also
Delphi-Quelltext 1: 2:
| nx := 1+(x+i) mod 8; ny := 1+(y+i) mod 8; |
(2) die negativen Werte sind komisch, muss ich erst einmal selbst überprüfen
[edit]
(3) ein Abs einfügen
Delphi-Quelltext 1: 2:
| nx := 1+Abs((x-i) mod 8); ny := 1+(y+i) mod 8; |
_________________ Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
|
|
DorJo 
      
Beiträge: 139
|
Verfasst: Do 28.02.08 21:46
@kroko: bei mir funzt das ni
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| var i, x, y: integer; begin Memo1.Clear; x:=strtoint(Edit1.Text); y:=strtoint(Edit2.Text); Memo1.Lines.Add('Diagonale nach rechts unten:'); for i:=1 to 8 do begin Memo1.Lines.Add(inttostr(1+Abs((x+i) mod 8))+',' + inttostr(1+(y+i) mod 8)); end; Memo1.Lines.add('Diagonale nach links unten:'); for i:=1 to 8 do begin Memo1.Lines.Add(inttostr(1+Abs((x-i) mod 8))+',' + inttostr(1+(y+i) mod 8)); end; |
BSP.: x=2 y=4
Diagonale nach rechts unten:
6,4 ja
7,5 ja
8,6 ja
1,7 nein
2,8 nein
3,1 ja
4,2 ja
5,3 ja
Diagonale nach links unten:
4,4 nein
3,5 nein
2,6 nein
1,7 nein
2,8 nein
3,1 ja (aber nach rechts unten schon)
4,2 ja
5,3 nein
~~>nach links unten müsste egtl. sein:
5,1
3,3
2,4
1,5
|
|
Kroko
      
Beiträge: 1284
W98 W2k WXP
Turbo D
|
Verfasst: Fr 29.02.08 08:39
ja, mein Fehler!
Geht es um das n-Damen -Problem?
_________________ Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
|
|
DorJo 
      
Beiträge: 139
|
Verfasst: Fr 29.02.08 11:53
@Kroko: Also wenn ich dieses n-Damen Problem richtig verstanden hab handelt es sich darum... ich möchte im Prinzip die Zugmöglichkeiten eines Läufers im Schachspiel prüfen!
|
|
Kroko
      
Beiträge: 1284
W98 W2k WXP
Turbo D
|
Verfasst: Fr 29.02.08 12:37
Okay, dann teste Schrittweise ( for I := 0 to 7 do)
(1) rechts unten
Delphi-Quelltext 1: 2:
| nx := x+I; ny := y+I; | (2) links unten
Delphi-Quelltext 1: 2:
| nx := x-I; ny := y+I; | (3) rechts oben
Delphi-Quelltext 1: 2:
| nx := x+I; ny := y-I; | (4) links oben
Delphi-Quelltext 1: 2:
| nx := x-I; ny := y-I; | bis Delphi-Quelltext 1: 2: 3:
| if (nx>0) and (ny>0) and (nx<8) and (ny<8) then else |
_________________ Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
|
|
DorJo 
      
Beiträge: 139
|
Verfasst: Fr 29.02.08 12:47
@Kroko: Das versteh ich grad gar ni  Was soll ich denn schrittweisse testen! Könntest du mir mal bitte erklären welcher grundgedanke dahinter steckt?! DANKE!!!
|
|
Kroko
      
Beiträge: 1284
W98 W2k WXP
Turbo D
|
Verfasst: Fr 29.02.08 13:37
(a) Was gibt es denn da nicht zu verstehen?
(B) Du hast eine Position X,Y und möchtest für den Läufer testen ob er wie weit laufen kann also Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| var I,nx,ny: Integer; HFehler: Boolean; begin HFehler := False; for I := 0 to 7 do if not(HFehler) then begin nx := x+I; ny := y+I; if (nx>0) and (ny>0) and (nx<8) and (ny<8) then else HFehler := True; end; end; |
(c) Für die anderen Richtungen nx/ny anpassen (s.o.)!
_________________ Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
|
|
DorJo 
      
Beiträge: 139
|
Verfasst: Fr 29.02.08 15:08
SUUUUPI!!! Jetz gehts!!! DANKE DANKE DANKE!!!
DANKE!
MfG Jo
|
|
|