Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Diagonalen überprüfen in 2-dimensionalem Array


DorJo - Do 28.02.08 14:47
Titel: Diagonalen überprüfen in 2-dimensionalem Array
Hy @ all,
ich bins mal wieder :oops:
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 :cry:
3) x<y (nach unten verschon) ~~> auch keine Ahnung :cry:

ich würde mich sehr über Vorschläge freuen
und danke schon mal im Voraus!

MfG

Dor JO


Gausi - Do 28.02.08 14: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;


Kroko - Do 28.02.08 14: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 )


DorJo - Do 28.02.08 14:54

WOW :shock:
Danke für die superschnellen Antworten

@Gausi: ja genausowas mein ich :wink:
@Kroko: das versteh ich nicht! Könntest du das bitte ein bisschen genauer erklären?! :oops:


Kroko - Do 28.02.08 15: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, :wink:


Horst_H - Do 28.02.08 15: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: http://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 - Do 28.02.08 18: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 - Do 28.02.08 18:30

Hallo,

zum Verständnis wie man die Diagonalen abfragen kann:
Eine Seite mit passendem Namen; Delphi for fun ...
http://www.delphiforfun.org/Programs/EightQueensPlus.htm


Kroko - Do 28.02.08 19: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;


DorJo - Do 28.02.08 20:46

@kroko: bei mir funzt das ni :cry:

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 - Fr 29.02.08 07:39

ja, mein Fehler!
Geht es um das n-Damen -Problem?


DorJo - Fr 29.02.08 10: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 - Fr 29.02.08 11: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>0and (ny>0and (nx<8and (ny<8
  then //Okay
  else //Fehler


DorJo - Fr 29.02.08 11:47

@Kroko: Das versteh ich grad gar ni :oops: :cry: Was soll ich denn schrittweisse testen! Könntest du mir mal bitte erklären welcher grundgedanke dahinter steckt?! DANKE!!!


Kroko - Fr 29.02.08 12: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>0and (ny>0and (nx<8and (ny<8
          then //Okay
          else HFehler := True;
      end;     
end;

(c) Für die anderen Richtungen nx/ny anpassen (s.o.)!


DorJo - Fr 29.02.08 14:08

SUUUUPI!!! Jetz gehts!!! DANKE DANKE DANKE!!!


DANKE!

MfG Jo