Autor Beitrag
DorJo
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 139



BeitragVerfasst: Do 28.02.08 15:47 
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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 28.02.08 15:50 
Meinst du sowas?
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 139



BeitragVerfasst: Do 28.02.08 15: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: 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, :wink:

_________________
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 139



BeitragVerfasst: Do 28.02.08 19:12 
Hmm
@Kroko: Das funktioniert leider nicht der Algorithmus :(
Ich hab aus deiner Beschreibung folgenden Code gemacht:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Do 28.02.08 20:55 
(1) ja, bei mir geht das Array von 0..7, bei dir von 1 bis 8, also
ausblenden 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
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 139



BeitragVerfasst: Do 28.02.08 21:46 
@kroko: bei mir funzt das ni :cry:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 139



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Fr 29.02.08 12:37 
Okay, dann teste Schrittweise (for I := 0 to 7 do)
(1) rechts unten
ausblenden Delphi-Quelltext
1:
2:
  nx := x+I;
  ny := y+I;
(2) links unten
ausblenden Delphi-Quelltext
1:
2:
  nx := x-I;
  ny := y+I;
(3) rechts oben
ausblenden Delphi-Quelltext
1:
2:
  nx := x+I;
  ny := y-I;
(4) links oben
ausblenden Delphi-Quelltext
1:
2:
  nx := x-I;
  ny := y-I;
bis
ausblenden Delphi-Quelltext
1:
2:
3:
if (nx>0and (ny>0and (nx<8and (ny<8
  then //Okay
  else //Fehler

_________________
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 139



BeitragVerfasst: Fr 29.02.08 12: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: 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
ausblenden 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.)!

_________________
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 139



BeitragVerfasst: Fr 29.02.08 15:08 
SUUUUPI!!! Jetz gehts!!! DANKE DANKE DANKE!!!


DANKE!

MfG Jo