Beste Tweakers,
Voor een schoolopdracht moeten we het 8 koninginnen probleem oplossen, we zijn beginnend c programmeurs, dus het bevatten van diagonaal door een 2d array gaan is lastig.
Voor de oplossing moet er diagonaal gecheckt worden of er niet meer dan 2 koninginnen in 1 rij staan. Dit is ons gelukt, maar we hebben het gevoel dat de code onnodig lang is. De code wordt namelijk 1.2 miljoen keer aangeroepen en snelheid is dus gewenst.
Elke keer als we bij de test lus aankomen voor een geldige plaatsing hebben we dus een 8x8 array bord[i][j]. Deze is gevuld met 0 voor de lege plekken en een 1 voor de koningin (8 totaal dus).
Size = 8
Hier tellen we diagonaal van linksboven naar rechtsonder. Alle vakjes van elke rij worden opgeteld in een buffer en daarna wordt er gekeken of het totaal groter dan 1 is, vervolgens wordt het buffer 0 en wordt de volgende rij bekeken.
Hier wordt het array gecheckt van rechtsboven naar linksonder. We konden geen verband vinden tussen het boven deel en het onder deel (dus array[i][j] array[j][i] maken werkt niet) dus hebben we 2 keer een geneste for gebruikt voor beide delen.
Onze vraag is dus, kunnen we de diagonale (rechtboven naar linksonder) code combineren? En is het mogelijk om het totaal nog compacter te krijgen?
Met vriendelijke groeten,
Peter(lamain) en Chris(Chris_NL)
Voor een schoolopdracht moeten we het 8 koninginnen probleem oplossen, we zijn beginnend c programmeurs, dus het bevatten van diagonaal door een 2d array gaan is lastig.
Voor de oplossing moet er diagonaal gecheckt worden of er niet meer dan 2 koninginnen in 1 rij staan. Dit is ons gelukt, maar we hebben het gevoel dat de code onnodig lang is. De code wordt namelijk 1.2 miljoen keer aangeroepen en snelheid is dus gewenst.
Elke keer als we bij de test lus aankomen voor een geldige plaatsing hebben we dus een 8x8 array bord[i][j]. Deze is gevuld met 0 voor de lege plekken en een 1 voor de koningin (8 totaal dus).
Size = 8
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
| for(n=0; n<SIZE; n++){ for(i=n, j=0; i<SIZE, j<SIZE-n; i++,j++){ buffer = buffer + bord[i][j]; buffer2 = buffer2 + bord[j][i]; } if(buffer > 1) return 0; if(buffer2 > 1) return 0; buffer = 0; buffer2 = 0; } |
Hier tellen we diagonaal van linksboven naar rechtsonder. Alle vakjes van elke rij worden opgeteld in een buffer en daarna wordt er gekeken of het totaal groter dan 1 is, vervolgens wordt het buffer 0 en wordt de volgende rij bekeken.
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| for(n=0; n<SIZE; n++){ for(i=0, j = SIZE-1-n; i<SIZE-n,j>-1; i++,j--){ buffer = buffer + bord[j][i]; } if(buffer > 1) return 0; buffer = 0; } for(n=0; n<SIZE; n++){ for(i=n, j=SIZE-1; i<SIZE, j>=n; i++, j--){ buffer = buffer + bord[j][i]; } if(buffer > 1){ return 0; } buffer = 0; } return 1; } |
Hier wordt het array gecheckt van rechtsboven naar linksonder. We konden geen verband vinden tussen het boven deel en het onder deel (dus array[i][j] array[j][i] maken werkt niet) dus hebben we 2 keer een geneste for gebruikt voor beide delen.
Onze vraag is dus, kunnen we de diagonale (rechtboven naar linksonder) code combineren? En is het mogelijk om het totaal nog compacter te krijgen?
Met vriendelijke groeten,
Peter(lamain) en Chris(Chris_NL)