007
02.09.2004, 12:43 Uhr
virtual
Sexiest Bit alive (Operator)
|
Hm , also ich fand das ne ganz nette Aufgabe für die Mittagspause, allerdings kann ich nicht behaupten, auf die Probleme gelaufen zu sein, die GateKeeper nannte.
C++: |
#include <stdio.h> #include <stdlib.h>
#define BREITE 6 #define HOEHE 6 #define LAENGE 4
int spielfeld[BREITE][HOEHE];
int teste_konflikt(int x, int y, int laenge, int vertikal) { int i; for(i=0; i<laenge; ++i) { if (vertikal) { if (spielfeld[x][y+i]) return 1; } else { if (spielfeld[x+i][y]) return 1; } } return 0; }
void setze_schiff(int x, int y, int laenge, int vertikal) { int i; for(i=0; i<laenge; ++i) { if (vertikal) { spielfeld[x][y+i] = 1; } else { spielfeld[x+i][y] = 1; } } }
void spielfeld_initialisieren() { int laenge; for(laenge=LAENGE; laenge>0; --laenge) { int a; for(a=0; a<LAENGE+2-laenge; ++a) { int x; int y; int vertikal; do { vertikal = rand()%2; if (vertikal) { x = rand()%BREITE; y = rand()%(HOEHE+1-laenge); } else { x = rand()%(BREITE+1-laenge); y = rand()%HOEHE; } } while(teste_konflikt(x, y, laenge, vertikal)); setze_schiff(x,y,laenge, vertikal); } } }
void ausgeben() { int x,y; for(y=0; y<HOEHE; ++y) { for(x=0; x<BREITE; ++x) { putchar(spielfeld[x][y]? '#':' '); } puts(""); } }
int main() { srand(time(NULL)); spielfeld_initialisieren(); ausgeben(); }
|
Drei Anmerkungen 1. Ist wirklich nur auf das wesentliche Reduziert und nicht schön. 2. Ich fange mit den großen Schiffen an, weil es logiscerweise komplizierter ist, große Schiffe in ein Feld zu setzen, welches bereits kleine Schiffe enthält. 3. Man sollte beachten, daß ein Schiff nur in einem Teilbereich des Spielfeldes einen Anfangspunkt haben kann Ein Schiff mit der Länge L auf einen Spielfeld der Größe B*H kann nur folgende Anfangspunkte haben: a) Bei Vertikaler ausrichtung: 0/0 .. B/H-L+1 b) Bei Horizontaler ausrichtung:0/0 .. B-L+1/H Befolgt man dies, kann man einerseits die möglichen Anfangsposition grade für große Schiffe deutlich reduzieren; andererseits kann man sich im Programmcode die Abfrage sparen, ob ein Schiff aus dem Spielfeld herausragt. -- Gruß, virtual Quote of the Month Ich eß' nur was ein Gesicht hat (Creme 21) Dieser Post wurde am 02.09.2004 um 12:45 Uhr von virtual editiert. |