Napoleonproblemet|Programmering / Grafisk formgivning|Forum|Nordichardware

Search
Forum Scope


Match



Forum Options



Minimum search word length is 3 characters - maximum search word length is 84 characters
Lost password?
The forums are currently locked and only available for read only access
sp_Feed sp_TopicIcon
Napoleonproblemet
nule
Nu vet jag hur man gör inlägg!
Medlem
Forum Posts: 31
Member Since:
November 15, 2001
sp_UserOfflineSmall Offline
1
November 26, 2001 - 5:53 pm
sp_Permalink sp_Print

Läser Algoritmer och Datastrukturer.
Har ett problem att lösa med 8 vita drottningar på schackbräde.

Detta skall lösas med pseudokod.Några förslag?

Jerry
Member
Medlem
Forum Posts: 4381
Member Since:
June 18, 2001
sp_UserOfflineSmall Offline
110727
November 26, 2001 - 7:42 pm
sp_Permalink sp_Print

Beskriv problemet...

_paul_
Mina inlägg skrivs i binär kod
Medlem
Forum Posts: 126
Member Since:
August 2, 2001
sp_UserOfflineSmall Offline
110778
November 26, 2001 - 8:33 pm
sp_Permalink sp_Print

Triviala sätt prova gör en uttömmande sökning och pröva alla positioner men komplexiteten blir urusel.

Pröva placera damen i varje position på raden i tur och ordning.

Kan damen stå ohotad i den positionen placera den på raden under.

int queenpos[8] queenpos[0] ger var på rad 1 som damen ska in.
queenpos[2] ger var på rad 3 som damen ska in osv.
När körningen är klar

testRow(int row)
for i=0 i < 8 ; i++ {
queenpos[row]=i
if PosOK() {
if row == 7 //färdig
skriv ut lösningen och avbryt ingen idé att fortsätta när vi hittat en möjlig lösning
else
testRow(row+1)
}
}

PosOK funktion som retunerar sant om damen kan placeras där utågende från färg samt ifall den kan ta någon annan pjäs.

Börja med anropet testRow(0)

Prövar alla möjliga kombinationer tills den finner en lösning som funkar.

EDIT: Konstig mening.

[ Detta Inlägg ändrades av: _paul_ den 2001-11-26 21:33 ]

[ Detta Inlägg ändrades av: _paul_ den 2001-11-26 21:34 ]

[ Detta Inlägg ändrades av: _paul_ den 2001-11-26 21:40 ]

_paul_
Mina inlägg skrivs i binär kod
Medlem
Forum Posts: 126
Member Since:
August 2, 2001
sp_UserOfflineSmall Offline
110785
November 26, 2001 - 8:37 pm
sp_Permalink sp_Print

Jerry:
Det är ett klassikt problem som går ut på hur man ska placera ut 8 damer på ett schackbräde utan att de kan ta/"käka upp varandra".

Jerry
Member
Medlem
Forum Posts: 4381
Member Since:
June 18, 2001
sp_UserOfflineSmall Offline
110798
November 26, 2001 - 8:46 pm
sp_Permalink sp_Print

Så här, eller?

[0] [0] [0] [#] [0] [0] [0] [0]

[0] [0] [0] [0] [0] [#] [0] [0]

[0] [0] [0] [0] [0] [0] [0] [#]

[0] [#] [0] [0] [0] [0] [0] [0]

[0] [0] [0] [0] [0] [0] [#] [0]

[#] [0] [0] [0] [0] [0] [0] [0]

[0] [0] [#] [0] [0] [0] [0] [0]

[0] [0] [0] [0] [#] [0] [0] [0]

_________________
P4 1,4, ASUS P4T, PoV GF2 MX200, SB live(!), 2*64 RDRAM, Iiyama 19"

[ Detta Inlägg ändrades av: Jerry den 2001-11-26 21:47 ]

_paul_
Mina inlägg skrivs i binär kod
Medlem
Forum Posts: 126
Member Since:
August 2, 2001
sp_UserOfflineSmall Offline
110805
November 26, 2001 - 8:50 pm
sp_Permalink sp_Print

Jo jag tror åtminstone det var det här problemet nule menade. Snabbt jobbat av dig smile

nule
Nu vet jag hur man gör inlägg!
Medlem
Forum Posts: 31
Member Since:
November 15, 2001
sp_UserOfflineSmall Offline
111129
November 27, 2001 - 1:30 pm
sp_Permalink sp_Print

Funderar på att göra en backtracking eller en rekursiv lösning. Någon som har ett tips på pseudokod till dessa lösningar. (Eller kod)

Jerry
Member
Medlem
Forum Posts: 4381
Member Since:
June 18, 2001
sp_UserOfflineSmall Offline
111220
November 27, 2001 - 4:13 pm
sp_Permalink sp_Print

Pos dam i kolumn 1, rad 1

Pos dam2 i kolumn 2, första raden där det inte står någon annan dam och där prev_damRad - dam2Rad = prev_damKolumn - dam2Kolumn. (då står de nämligen i samma diagonal)
Fortsätt så tills du inte kan placera ut en dam på nästföljande kolumn längre, då går du tillbaka ett steg och flyttar den damen till nästa möjliga rad. Finns det ingen annan rad, gå tillbaka till den före osv.

// skapa ett bräde först sedan...

k=0;
funkt(board, 1, 0);

funkt(Board[][] board, j,k)
i=1;
while(i<=8)
{
for(int p = 0; p < k; p++)
{
if(!(dam[p].X - i == dam[p].Y - j) && !(dam.[p].X == i)) {antalOk++;}
}
if(antalOk == p) //Inget hot => ok att placera ut.
{
board[i][j] = dam[k];
dam[k].X = 1;
dam[k].Y = 1;

funkt(board, j+1,k+1); // låter nästa dam placeras ut.
}
i++;
}

Nu får du själv komma på hur du ska göra om den inte hittar någon plats att ställa damen på.

Hm...något rörig kod.. smile

_________________
P4 1,4, ASUS P4T, PoV GF2 MX200, SB live(!), 2*64 RDRAM, Iiyama 19"

[ Detta Inlägg ändrades av: Jerry den 2001-11-27 21:39 ]

Forum Timezone: Europe/Stockholm
Most Users Ever Online: 694
Currently Online:
Guest(s) 43
Currently Browsing this Page:
1 Guest(s)
Top Posters:
Andreas Galistel: 16287
Jonas Klar: 15897
ilg@dd: 10810
Nyhet: 10607
Mind: 10550
Ctrl: 10355
Gueno: 9881
Guest: 9344
Snorch: 8881
Callister: 8468
Newest Members:
PetrbonFU PetrbonFU
Karine Bembry
Dolores Mcdaniels
Anibal McLeish
Francisca Alt
Alfie Everhart
Lester Huitt
Orlando Jorgensen
Mikki Lundgren
Dakota Kozlowski
Forum Stats:
Groups: 11
Forums: 59
Topics: 146630
Posts: 1300967

 

Member Stats:
Guest Posters: 2
Members: 79425
Moderators: 0
Admins: 11
Administrators: nordicadmin, Henrik Berntsson, Anton Karmehed, Carl Holmberg, Joel Oscarsson, Mikael Linnér, Mikael Schwartz, Andreas Paulsson, Nickebjrk, Mattias Pettersson, EmxL