| Inhalt der Datei wuerfelnetze.perl |
#!/usr/bin/perl -w
######################################################################################
# Perlscript zur Erzeugung von Wuerfelnetzvariationen in einem Spielfeld im 5x7Format#
# Hintergrund ist eine mathematische Aufgabenstellung zur Optimierung von Wuerfel- #
# netzen. #
# Die Aufgabenstellung mit Erlaeuterungen zur Loesung sind unter #
# http://www.schlaefendorf.de/schule/mathematik/kl7/lb5/Wuerfelnetze-Aufgabe2L.pdf #
# zu finden. #
# Autor: Frank Schlaefendorf erstellt am: 25.05.2010 letze Aenderung: 06.06.2010 #
######################################################################################
#use strict;
# Array zum abspeichern der Spielfelder
@felder=();
# Array zum abspeichern der x-koordinaten der Wuerfelnetze
@xfigur=();
# Array zum abspeichern der y-koordinaten der Wuerfelnetze
@yfigur=();
# Array zum abpeichern der Netzinformationen in jedem Spielfeld
@netzinfo=();
# Netzinformationen fuer das Spielfeld 0
# aktuelle x-Setzposition im Spielfeld 0
$netzinfo[0][0]=-1;
# aktuelle y-Setzposition im Spielfeld 0
$netzinfo[0][1]=-1;
# aktuelle Netznummer im Spielfeld 0
$netzinfo[0][2]=0;
# Zaehler fuer die insgesamt ausgefuehrten Testschritte
$schrittzahl=0;
# Zaehler fuer die insgesamt ausgegebenen Spielfelder
$printzaehler=0;
# Zaehler fuer die insgesamt gefundenen Loesungen
$loesungszaehler=0;
######################################################################################
# Initialisierung von 6 Spielfeldern 0..5 in denen das 5x7 Spielareal angelegt wird. #
# Die freien Spielfelder werden mit dem Wert 0 belegt. #
# In den Feldern rechts und unterhalb des Spielfeldes wird ein Rand der Breite 4 mit #
# dem Wert -1 belegt. dieser Rand dient der Kollisionsrkennung fuer die Netze. #
# Der Aufruf dieser Unterfunktion erfordert keine Parameter. Die Felder werden im #
# globalen Array felder angelegt. #
# init_felder #
######################################################################################
sub init_felder {
my $x=0;
my $y=0;
my $n=0;
# 6 Felder werden eingerichtet.
# Die Randzone enthaelt den Wert -1
###############
#####yyyyyyyyy#
#####012345678#
#x0 #.....++++#
#x1 #.....++++#
#x2 #.....++++#
#x3 #.....++++#
#x4 #.....++++#
#x5 #.....++++#
#x6 #.....++++#
#x7 #+++++++++#
#x8 #+++++++++#
#x9 #+++++++++#
#x10#+++++++++#
###############
for($n=0;$n<=5;$n++){
for($x=0;$x<7;$x++){
for($y=0;$y<5;$y++){
$felder[$n][$x][$y]=0;
}
for($y=5;$y<9;$y++){
$felder[$n][$x][$y]=-1;
}
}
for($x=7;$x<11;$x++){
for($y=0;$y<9;$y++){
$felder[$n][$x][$y]=-1;
}
}
}
}
###############################################################################
# Kopierfunktion #
# Diese Funktion kopiert den Inhalt des Feldes A in das Feld B, wobei A und B #
# Nummern von 0 bis 5 sind und die Feldnummer angeben. Der alte Inhalt in #
# Feld B wird ueberschrieben. #
# Der Aufruf der Funktion erfordert also zwei Parameter #
# copy_felder(A,B); #
###############################################################################
sub copy_felder {
my $x=0;
my $y=0;
my $feldnr1=$_[0];
my $feldnr2=$_[1];
for($x=0;$x<7;$x++){
for($y=0;$y<5;$y++){
$felder[$feldnr2][$x][$y]=$felder[$feldnr1][$x][$y];
}
}
}
###############################################################################
# Testfunktion #
# Diese Funktion testet, ob das Netz Nummer N im Feld Nummer F an der #
# Position X , Y ohne Kollision mit einem anderen Netz oder dem Rand abgelegt #
# werden kann. #
# Wenn das moeglich ist, wird der Wert 0 zurueckgegeben. Bei einer Kollision #
# mit dem rechten Rand wird der Wert -1 und bei Kollision mit dem unteren #
# Rand der Wert -2 zurueckgegeben. Kollidiert das Netz N mit einem bereits #
# abgelegten Netz, so wird ein Wert groeszer 0 (die Ebenennummer) zurueck #
# gegeben. #
# Die Parameter N , F , X und Y werden beim Aufruf erwartet. #
# can_set_wnetz(N,F,X,Y); #
###############################################################################
sub can_set_wnetz {
my $x=0;
my $y=0;
my $wert=0;
my $pnummer=0;
my $wnetz=$_[0];
my $feldnummer=$_[1];
my $posx=$_[2];
my $posy=$_[3];
for($pnummer=0;$pnummer<6;$pnummer++){
$x=$posx+$xfigur[$wnetz][$pnummer];
$y=$posy+$yfigur[$wnetz][$pnummer];
$wert=$felder[$feldnummer][$x][$y];
if($wert == -1){
if($pnummer == 1){
return -2;
}else{
return -1;
}
}elsif($wert > 0){
return 1;
}
}
return 0;
}
################################################################################
# Setzfunktion #
# Diese Funktion setzt das Netz Nummer N im Feld Nummer F an der Position X,Y #
# ab. Dabei wird das Netz in dem Feld mit einer Ordnungsnummer M, die groeszer #
# als 0 sein muss, abgespeichert. Die Funktion fuehrt keine Kollisions- #
# erkennung durch, diese muss vorhr erfolgen. #
# Die Parameter N , F , X ,Y und M werden beim Aufruf erwartet. #
# set_wnetz(N,F,X,Y,M); #
################################################################################
sub set_wnetz {
my $x=0;
my $y=0;
my $pnummer=0;
my $wnetz=$_[0];
my $feldnummer=$_[1];
my $posx=$_[2];
my $posy=$_[3];
my $wnummer=$_[4];
for($pnummer=0;$pnummer<6;$pnummer++){
$x=$xfigur[$wnetz][$pnummer]+$posx;
$y=$yfigur[$wnetz][$pnummer]+$posy;
$felder[$feldnummer][$x][$y]=$wnummer;
}
return 1;
}
#######################################################################
# Hauptprogramm #
# Es werden alle moeglichen Anordnungen von Wuerfelnetzen ausprobiert.#
# Wenn mindestens 4 Wuerfelnetze gesetzt werden konnten, wird das #
# Netz mit ein paar Zusatzinformationen ausgegeben. #
# Als Parameter erwartet die Funktion die Nummer des ersten Spiel- #
# feldes, also 0 #
# mainproc(0); #
#######################################################################
sub mainproc {
my $x=0;
my $y=0;
my $z=0;
my $wert=0;
my $wnetz=0;
my $permut=0;
my $feldnummer=$_[0];
my $nfeldnummer=$feldnummer+1;
if($feldnummer<5){
OVER: for($wnetz=$netzinfo[$feldnummer][2];$wnetz<64;$wnetz++){
OUTER: for($x=0;$x<7;$x++){
INNER: for($y=0;$y<5;$y++){
$netzinfo[$nfeldnummer][0]=$x;
$netzinfo[$nfeldnummer][1]=$y;
$netzinfo[$nfeldnummer][2]=$wnetz;
for($z=$nfeldnummer+1;$z<6;$z++){
$netzinfo[$z][0]=-1;
$netzinfo[$z][1]=-1;
$netzinfo[$z][2]=-1;
}
$schrittzahl++;
$wert=can_set_wnetz($wnetz,$feldnummer,$x,$y);
if($wert == 0){
copy_felder($feldnummer,$nfeldnummer);
set_wnetz($wnetz,$nfeldnummer,$x,$y,$nfeldnummer);
if($nfeldnummer>=4){print_feld($nfeldnummer)};
mainproc($nfeldnummer);
}
next OUTER if($wert == -1);
next OVER if($wert == -2);
}
}
}
}else{
$loesungszaehler++;
print "############################################################\n";
print "############################################################\n";
print "####################### L O E S U N G ######################\n";
print "############################################################\n";
print "############################################################\n";
print_feld($feldnummer);
print "############################################################\n";
print "############################################################\n";
}
}
######################################################
# Ausgabefunktion #
# Es wird das Spielfeld mit der Nummer N ausgegeben. #
# print_feld(N); #
######################################################
sub print_feld {
my $nummer=$_[0];
my $x=0;
my $y=0;
$printzaehler++;
print "\n";
print "Netz Nr:".$printzaehler."\n";
print "Schritt:".$schrittzahl." Anzahl gefundener Lösungen=".$loesungszaehler."\n";
for($x=0;$x<7;$x++){
for($y=0;$y<5;$y++){
if($felder[$nummer][$x][$y] == 0){
print ".";
}else{
print $felder[$nummer][$x][$y];
}
}
if($x>0 && $x<6){
print " ".$x." x=".$netzinfo[$x][0]." y=".$netzinfo[$x][1]." Netz=".$netzinfo[$x][2]."\n";
}else{
print "\n";
}
}
}
sub init_figuren {
###############################################################################################
# Initialisierungsroutine fuer die Figurenspeicher, in denen die Form der 11 Wuerfelnetze #
# gespeichert ist. #
# $xfigur[Wuerfelnetznummer][Punktnummer]= x-koordinate des Wuerfelnetzpunktes im Wuerfelnetz #
# $yfigur[Wuerfelnetznummer][Punktnummer]= y-koordinate des Wuerfelnetzpunktes im Wuerfelnetz #
# Von den 88 moeglichen Netzformen wurden Doppelungen entfern, sodass 64 Wuerfelnetzformen #
# uebrig bleiben. Aus Gruenden der Rechengeschwindigkeit sind alle Netze so weit wie moeglich #
# nach links oben ausgerichtet. Fuer eine ,moeglichst fruehzeitige Randkollisionserkennung #
# ist in der Definitionstabelle das am weitesten rechts liegende Wuerfelnetzfeld eingetragen. #
# Der zweite Eintrg enthaelt das am weitesten unten liegende Feld. #
###############################################################################################
# Wuerfelnetz 0
#########
# yyyyy#
# 01234#
#x0*....#
#x1****.#
#x2*....#
#x3.....#
#x4.....#
#########
$xfigur[0][0]=1; $yfigur[0][0]=3;
$xfigur[0][1]=2; $yfigur[0][1]=0;
$xfigur[0][2]=1; $yfigur[0][2]=1;
$xfigur[0][3]=1; $yfigur[0][3]=2;
$xfigur[0][4]=0; $yfigur[0][4]=0;
$xfigur[0][5]=1; $yfigur[0][5]=0;
# Wuerfelnetz 1
#########
# yyyyy#
# 01234#
#x0***..#
#x1.*...#
#x2.*...#
#x3.*...#
#x4.....#
#########
$xfigur[1][0]=0; $yfigur[1][0]=2;
$xfigur[1][1]=3; $yfigur[1][1]=1;
$xfigur[1][2]=0; $yfigur[1][2]=0;
$xfigur[1][3]=1; $yfigur[1][3]=1;
$xfigur[1][4]=2; $yfigur[1][4]=1;
$xfigur[1][5]=0; $yfigur[1][5]=1;
# Wuerfelnetz 2
#########
# yyyyy#
# 01234#
#x0...*.#
#x1****.#
#x2...*.#
#x3.....#
#x4.....#
#########
$xfigur[2][0]=2; $yfigur[2][0]=3;
$xfigur[2][1]=1; $yfigur[2][1]=0;
$xfigur[2][2]=1; $yfigur[2][2]=1;
$xfigur[2][3]=1; $yfigur[2][3]=2;
$xfigur[2][4]=1; $yfigur[2][4]=3;
$xfigur[2][5]=0; $yfigur[2][5]=3;
# Wuerfelnetz 3
#########
# yyyyy#
# 01234#
#x0.*...#
#x1.*...#
#x2.*...#
#x3***..#
#x4.....#
#########
$xfigur[3][0]=3; $yfigur[3][0]=2;
$xfigur[3][1]=0; $yfigur[3][1]=1;
$xfigur[3][2]=3; $yfigur[3][2]=0;
$xfigur[3][3]=1; $yfigur[3][3]=1;
$xfigur[3][4]=2; $yfigur[3][4]=1;
$xfigur[3][5]=3; $yfigur[3][5]=1;
# Wuerfelnetz 4
#########
# yyyyy#
# 01234#
#x0*....#
#x1****.#
#x2.*...#
#x3.....#
#x4.....#
#########
$xfigur[4][0]=1; $yfigur[4][0]=3;
$xfigur[4][1]=2; $yfigur[4][1]=1;
$xfigur[4][2]=1; $yfigur[4][2]=1;
$xfigur[4][3]=1; $yfigur[4][3]=2;
$xfigur[4][4]=0; $yfigur[4][4]=0;
$xfigur[4][5]=1; $yfigur[4][5]=0;
# Wuerfelnetz 5
#########
# yyyyy#
# 01234#
#x0.**..#
#x1**...#
#x2.*...#
#x3.*...#
#x4.....#
#########
$xfigur[5][0]=0; $yfigur[5][0]=2;
$xfigur[5][1]=3; $yfigur[5][1]=1;
$xfigur[5][2]=1; $yfigur[5][2]=0;
$xfigur[5][3]=1; $yfigur[5][3]=1;
$xfigur[5][4]=2; $yfigur[5][4]=1;
$xfigur[5][5]=0; $yfigur[5][5]=1;
# Wuerfelnetz 6
#########
# yyyyy#
# 01234#
#x0..*..#
#x1****.#
#x2...*.#
#x3.....#
#x4.....#
#########
$xfigur[6][0]=2; $yfigur[6][0]=3;
$xfigur[6][1]=1; $yfigur[6][1]=0;
$xfigur[6][2]=1; $yfigur[6][2]=1;
$xfigur[6][3]=1; $yfigur[6][3]=2;
$xfigur[6][4]=1; $yfigur[6][4]=3;
$xfigur[6][5]=0; $yfigur[6][5]=2;
# Wuerfelnetz 7
#########
# yyyyy#
# 01234#
#x0.*...#
#x1.*...#
#x2.**..#
#x3**...#
#x4.....#
#########
$xfigur[7][0]=2; $yfigur[7][0]=2;
$xfigur[7][1]=3; $yfigur[7][1]=0;
$xfigur[7][2]=0; $yfigur[7][2]=1;
$xfigur[7][3]=1; $yfigur[7][3]=1;
$xfigur[7][4]=2; $yfigur[7][4]=1;
$xfigur[7][5]=3; $yfigur[7][5]=1;
# Wuerfelnetz 8
#########
# yyyyy#
# 01234#
#x0.*...#
#x1****.#
#x2*....#
#x3.....#
#x4.....#
#########
$xfigur[8][0]=1; $yfigur[8][0]=3;
$xfigur[8][1]=2; $yfigur[8][1]=0;
$xfigur[8][2]=1; $yfigur[8][2]=1;
$xfigur[8][3]=1; $yfigur[8][3]=2;
$xfigur[8][4]=0; $yfigur[8][4]=1;
$xfigur[8][5]=1; $yfigur[8][5]=0;
# Wuerfelnetz 9
#########
# yyyyy#
# 01234#
#x0**...#
#x1.**..#
#x2.*...#
#x3.*...#
#x4.....#
#########
$xfigur[9][0]=1; $yfigur[9][0]=2;
$xfigur[9][1]=3; $yfigur[9][1]=1;
$xfigur[9][2]=0; $yfigur[9][2]=1;
$xfigur[9][3]=1; $yfigur[9][3]=1;
$xfigur[9][4]=2; $yfigur[9][4]=1;
$xfigur[9][5]=0; $yfigur[9][5]=0;
# Wuerfelnetz 10
#########
# yyyyy#
# 01234#
#x0...*.#
#x1****.#
#x2..*..#
#x3.....#
#x4.....#
#########
$xfigur[10][0]=0; $yfigur[10][0]=3;
$xfigur[10][1]=2; $yfigur[10][1]=2;
$xfigur[10][2]=1; $yfigur[10][2]=1;
$xfigur[10][3]=1; $yfigur[10][3]=2;
$xfigur[10][4]=1; $yfigur[10][4]=3;
$xfigur[10][5]=1; $yfigur[10][5]=0;
# Wuerfelnetz 11
#########
# yyyyy#
# 01234#
#x0.*...#
#x1.*...#
#x2**...#
#x3.**..#
#x4.....#
#########
$xfigur[11][0]=3; $yfigur[11][0]=2;
$xfigur[11][1]=2; $yfigur[11][1]=0;
$xfigur[11][2]=0; $yfigur[11][2]=1;
$xfigur[11][3]=1; $yfigur[11][3]=1;
$xfigur[11][4]=2; $yfigur[11][4]=1;
$xfigur[11][5]=3; $yfigur[11][5]=1;
# Wuerfelnetz 12
#########
# yyyyy#
# 01234#
#x0*....#
#x1****.#
#x2..*..#
#x3.....#
#x4.....#
#########
$xfigur[12][0]=1; $yfigur[12][0]=3;
$xfigur[12][1]=2; $yfigur[12][1]=2;
$xfigur[12][2]=1; $yfigur[12][2]=1;
$xfigur[12][3]=1; $yfigur[12][3]=2;
$xfigur[12][4]=0; $yfigur[12][4]=0;
$xfigur[12][5]=1; $yfigur[12][5]=0;
# Wuerfelnetz 13
#########
# yyyyy#
# 01234#
#x0.**..#
#x1.*...#
#x2**...#
#x3.*...#
#x4.....#
#########
$xfigur[13][0]=0; $yfigur[13][0]=2;
$xfigur[13][1]=3; $yfigur[13][1]=1;
$xfigur[13][2]=2; $yfigur[13][2]=0;
$xfigur[13][3]=1; $yfigur[13][3]=1;
$xfigur[13][4]=2; $yfigur[13][4]=1;
$xfigur[13][5]=0; $yfigur[13][5]=1;
# Wuerfelnetz 14
#########
# yyyyy#
# 01234#
#x0.*...#
#x1****.#
#x2...*.#
#x3.....#
#x4.....#
#########
$xfigur[14][0]=2; $yfigur[14][0]=3;
$xfigur[14][1]=1; $yfigur[14][1]=0;
$xfigur[14][2]=1; $yfigur[14][2]=1;
$xfigur[14][3]=1; $yfigur[14][3]=2;
$xfigur[14][4]=1; $yfigur[14][4]=3;
$xfigur[14][5]=0; $yfigur[14][5]=1;
# Wuerfelnetz 15
#########
# yyyyy#
# 01234#
#x0.*...#
#x1.**..#
#x2.*...#
#x3**...#
#x4.....#
#########
$xfigur[15][0]=1; $yfigur[15][0]=2;
$xfigur[15][1]=3; $yfigur[15][1]=0;
$xfigur[15][2]=0; $yfigur[15][2]=1;
$xfigur[15][3]=1; $yfigur[15][3]=1;
$xfigur[15][4]=2; $yfigur[15][4]=1;
$xfigur[15][5]=3; $yfigur[15][5]=1;
# Wuerfelnetz 16
#########
# yyyyy#
# 01234#
#x0..*..#
#x1****.#
#x2*....#
#x3.....#
#x4.....#
#########
$xfigur[16][0]=1; $yfigur[16][0]=3;
$xfigur[16][1]=2; $yfigur[16][1]=0;
$xfigur[16][2]=1; $yfigur[16][2]=1;
$xfigur[16][3]=1; $yfigur[16][3]=2;
$xfigur[16][4]=0; $yfigur[16][4]=2;
$xfigur[16][5]=1; $yfigur[16][5]=0;
# Wuerfelnetz 17
#########
# yyyyy#
# 01234#
#x0**...#
#x1.*...#
#x2.**..#
#x3.*...#
#x4.....#
#########
$xfigur[17][0]=2; $yfigur[17][0]=2;
$xfigur[17][1]=3; $yfigur[17][1]=1;
$xfigur[17][2]=0; $yfigur[17][2]=1;
$xfigur[17][3]=1; $yfigur[17][3]=1;
$xfigur[17][4]=2; $yfigur[17][4]=1;
$xfigur[17][5]=0; $yfigur[17][5]=0;
# Wuerfelnetz 18
#########
# yyyyy#
# 01234#
#x0...*.#
#x1****.#
#x2.*...#
#x3.....#
#x4.....#
#########
$xfigur[18][0]=0; $yfigur[18][0]=3;
$xfigur[18][1]=2; $yfigur[18][1]=1;
$xfigur[18][2]=1; $yfigur[18][2]=1;
$xfigur[18][3]=1; $yfigur[18][3]=2;
$xfigur[18][4]=1; $yfigur[18][4]=3;
$xfigur[18][5]=1; $yfigur[18][5]=0;
# Wuerfelnetz 19
#########
# yyyyy#
# 01234#
#x0.*...#
#x1**...#
#x2.*...#
#x3.**..#
#x4.....#
#########
$xfigur[19][0]=3; $yfigur[19][0]=2;
$xfigur[19][1]=1; $yfigur[19][1]=0;
$xfigur[19][2]=0; $yfigur[19][2]=1;
$xfigur[19][3]=1; $yfigur[19][3]=1;
$xfigur[19][4]=2; $yfigur[19][4]=1;
$xfigur[19][5]=3; $yfigur[19][5]=1;
# Wuerfelnetz 20
#########
# yyyyy#
# 01234#
#x0*....#
#x1****.#
#x2...*.#
#x3.....#
#x4.....#
#########
$xfigur[20][0]=2; $yfigur[20][0]=3;
$xfigur[20][1]=1; $yfigur[20][1]=0;
$xfigur[20][2]=1; $yfigur[20][2]=1;
$xfigur[20][3]=1; $yfigur[20][3]=2;
$xfigur[20][4]=1; $yfigur[20][4]=3;
$xfigur[20][5]=0; $yfigur[20][5]=0;
# Wuerfelnetz 21
#########
# yyyyy#
# 01234#
#x0.**..#
#x1.*...#
#x2.*...#
#x3**...#
#x4.....#
#########
$xfigur[21][0]=0; $yfigur[21][0]=2;
$xfigur[21][1]=3; $yfigur[21][1]=0;
$xfigur[21][2]=0; $yfigur[21][2]=1;
$xfigur[21][3]=1; $yfigur[21][3]=1;
$xfigur[21][4]=2; $yfigur[21][4]=1;
$xfigur[21][5]=3; $yfigur[21][5]=1;
# Wuerfelnetz 22
#########
# yyyyy#
# 01234#
#x0...*.#
#x1****.#
#x2*....#
#x3.....#
#x4.....#
#########
$xfigur[22][0]=0; $yfigur[22][0]=3;
$xfigur[22][1]=2; $yfigur[22][1]=0;
$xfigur[22][2]=1; $yfigur[22][2]=1;
$xfigur[22][3]=1; $yfigur[22][3]=2;
$xfigur[22][4]=1; $yfigur[22][4]=3;
$xfigur[22][5]=1; $yfigur[22][5]=0;
# Wuerfelnetz 23
#########
# yyyyy#
# 01234#
#x0**...#
#x1.*...#
#x2.*...#
#x3.**..#
#x4.....#
#########
$xfigur[23][0]=3; $yfigur[23][0]=2;
$xfigur[23][1]=0; $yfigur[23][1]=1;
$xfigur[23][2]=0; $yfigur[23][2]=0;
$xfigur[23][3]=1; $yfigur[23][3]=1;
$xfigur[23][4]=2; $yfigur[23][4]=1;
$xfigur[23][5]=3; $yfigur[23][5]=1;
# Wuerfelnetz 24
#########
# yyyyy#
# 01234#
#x0.*...#
#x1****.#
#x2..*..#
#x3.....#
#x4.....#
#########
$xfigur[24][0]=1; $yfigur[24][0]=3;
$xfigur[24][1]=2; $yfigur[24][1]=2;
$xfigur[24][2]=1; $yfigur[24][2]=1;
$xfigur[24][3]=1; $yfigur[24][3]=2;
$xfigur[24][4]=0; $yfigur[24][4]=1;
$xfigur[24][5]=1; $yfigur[24][5]=0;
# Wuerfelnetz 25
#########
# yyyyy#
# 01234#
#x0.*...#
#x1.**..#
#x2**...#
#x3.*...#
#x4.....#
#########
$xfigur[25][0]=1; $yfigur[25][0]=2;
$xfigur[25][1]=3; $yfigur[25][1]=1;
$xfigur[25][2]=2; $yfigur[25][2]=0;
$xfigur[25][3]=1; $yfigur[25][3]=1;
$xfigur[25][4]=2; $yfigur[25][4]=1;
$xfigur[25][5]=0; $yfigur[25][5]=1;
# Wuerfelnetz 26
#########
# yyyyy#
# 01234#
#x0..*..#
#x1****.#
#x2.*...#
#x3.....#
#x4.....#
#########
$xfigur[26][0]=1; $yfigur[26][0]=3;
$xfigur[26][1]=2; $yfigur[26][1]=1;
$xfigur[26][2]=1; $yfigur[26][2]=1;
$xfigur[26][3]=1; $yfigur[26][3]=2;
$xfigur[26][4]=0; $yfigur[26][4]=2;
$xfigur[26][5]=1; $yfigur[26][5]=0;
# Wuerfelnetz 27
#########
# yyyyy#
# 01234#
#x0.*...#
#x1**...#
#x2.**..#
#x3.*...#
#x4.....#
#########
$xfigur[27][0]=2; $yfigur[27][0]=2;
$xfigur[27][1]=3; $yfigur[27][1]=1;
$xfigur[27][2]=0; $yfigur[27][2]=1;
$xfigur[27][3]=1; $yfigur[27][3]=1;
$xfigur[27][4]=2; $yfigur[27][4]=1;
$xfigur[27][5]=1; $yfigur[27][5]=0;
# Wuerfelnetz 28
#########
# yyyyy#
# 01234#
#x0.*...#
#x1****.#
#x2.*...#
#x3.....#
#x4.....#
#########
$xfigur[28][0]=1; $yfigur[28][0]=3;
$xfigur[28][1]=2; $yfigur[28][1]=1;
$xfigur[28][2]=1; $yfigur[28][2]=1;
$xfigur[28][3]=1; $yfigur[28][3]=2;
$xfigur[28][4]=0; $yfigur[28][4]=1;
$xfigur[28][5]=1; $yfigur[28][5]=0;
# Wuerfelnetz 29
#########
# yyyyy#
# 01234#
#x0.*...#
#x1***..#
#x2.*...#
#x3.*...#
#x4.....#
#########
$xfigur[29][0]=1; $yfigur[29][0]=2;
$xfigur[29][1]=3; $yfigur[29][1]=1;
$xfigur[29][2]=1; $yfigur[29][2]=0;
$xfigur[29][3]=1; $yfigur[29][3]=1;
$xfigur[29][4]=2; $yfigur[29][4]=1;
$xfigur[29][5]=0; $yfigur[29][5]=1;
# Wuerfelnetz 30
#########
# yyyyy#
# 01234#
#x0..*..#
#x1****.#
#x2..*..#
#x3.....#
#x4.....#
#########
$xfigur[30][0]=1; $yfigur[30][0]=3;
$xfigur[30][1]=2; $yfigur[30][1]=2;
$xfigur[30][2]=1; $yfigur[30][2]=1;
$xfigur[30][3]=1; $yfigur[30][3]=2;
$xfigur[30][4]=0; $yfigur[30][4]=2;
$xfigur[30][5]=1; $yfigur[30][5]=0;
# Wuerfelnetz 31
#########
# yyyyy#
# 01234#
#x0.*...#
#x1.*...#
#x2***..#
#x3.*...#
#x4.....#
#########
$xfigur[31][0]=2; $yfigur[31][0]=2;
$xfigur[31][1]=3; $yfigur[31][1]=1;
$xfigur[31][2]=0; $yfigur[31][2]=1;
$xfigur[31][3]=1; $yfigur[31][3]=1;
$xfigur[31][4]=2; $yfigur[31][4]=1;
$xfigur[31][5]=2; $yfigur[31][5]=0;
# Wuerfelnetz 32
#########
# yyyyy#
# 01234#
#x0**...#
#x1.***.#
#x2.*...#
#x3.....#
#x4.....#
#########
$xfigur[32][0]=1; $yfigur[32][0]=3;
$xfigur[32][1]=2; $yfigur[32][1]=1;
$xfigur[32][2]=1; $yfigur[32][2]=1;
$xfigur[32][3]=1; $yfigur[32][3]=2;
$xfigur[32][4]=0; $yfigur[32][4]=0;
$xfigur[32][5]=0; $yfigur[32][5]=1;
# Wuerfelnetz 33
#########
# yyyyy#
# 01234#
#x0..*..#
#x1***..#
#x2.*...#
#x3.*...#
#x4.....#
#########
$xfigur[33][0]=0; $yfigur[33][0]=2;
$xfigur[33][1]=3; $yfigur[33][1]=1;
$xfigur[33][2]=1; $yfigur[33][2]=0;
$xfigur[33][3]=1; $yfigur[33][3]=1;
$xfigur[33][4]=2; $yfigur[33][4]=1;
$xfigur[33][5]=1; $yfigur[33][5]=2;
# Wuerfelnetz 34
#########
# yyyyy#
# 01234#
#x0..*..#
#x1***..#
#x2..**.#
#x3.....#
#x4.....#
#########
$xfigur[34][0]=2; $yfigur[34][0]=3;
$xfigur[34][1]=1; $yfigur[34][1]=0;
$xfigur[34][2]=1; $yfigur[34][2]=1;
$xfigur[34][3]=1; $yfigur[34][3]=2;
$xfigur[34][4]=2; $yfigur[34][4]=2;
$xfigur[34][5]=0; $yfigur[34][5]=2;
# Wuerfelnetz 35
#########
# yyyyy#
# 01234#
#x0.*...#
#x1.*...#
#x2***..#
#x3*....#
#x4.....#
#########
$xfigur[35][0]=2; $yfigur[35][0]=2;
$xfigur[35][1]=3; $yfigur[35][1]=0;
$xfigur[35][2]=0; $yfigur[35][2]=1;
$xfigur[35][3]=1; $yfigur[35][3]=1;
$xfigur[35][4]=2; $yfigur[35][4]=1;
$xfigur[35][5]=2; $yfigur[35][5]=0;
# Wuerfelnetz 36
#########
# yyyyy#
# 01234#
#x0.*...#
#x1.***.#
#x2**...#
#x3.....#
#x4.....#
#########
$xfigur[36][0]=1; $yfigur[36][0]=3;
$xfigur[36][1]=2; $yfigur[36][1]=0;
$xfigur[36][2]=1; $yfigur[36][2]=1;
$xfigur[36][3]=1; $yfigur[36][3]=2;
$xfigur[36][4]=0; $yfigur[36][4]=1;
$xfigur[36][5]=2; $yfigur[36][5]=1;
# Wuerfelnetz 37
#########
# yyyyy#
# 01234#
#x0*....#
#x1***..#
#x2.*...#
#x3.*...#
#x4.....#
#########
$xfigur[37][0]=1; $yfigur[37][0]=2;
$xfigur[37][1]=3; $yfigur[37][1]=1;
$xfigur[37][2]=1; $yfigur[37][2]=0;
$xfigur[37][3]=1; $yfigur[37][3]=1;
$xfigur[37][4]=2; $yfigur[37][4]=1;
$xfigur[37][5]=0; $yfigur[37][5]=0;
# Wuerfelnetz 38
#########
# yyyyy#
# 01234#
#x0..**.#
#x1***..#
#x2..*..#
#x3.....#
#x4.....#
#########
$xfigur[38][0]=0; $yfigur[38][0]=3;
$xfigur[38][1]=2; $yfigur[38][1]=2;
$xfigur[38][2]=1; $yfigur[38][2]=1;
$xfigur[38][3]=1; $yfigur[38][3]=2;
$xfigur[38][4]=0; $yfigur[38][4]=2;
$xfigur[38][5]=1; $yfigur[38][5]=0;
# Wuerfelnetz 39
#########
# yyyyy#
# 01234#
#x0.*...#
#x1.*...#
#x2***..#
#x3..*..#
#x4.....#
#########
$xfigur[39][0]=3; $yfigur[39][0]=2;
$xfigur[39][1]=2; $yfigur[39][1]=0;
$xfigur[39][2]=0; $yfigur[39][2]=1;
$xfigur[39][3]=1; $yfigur[39][3]=1;
$xfigur[39][4]=2; $yfigur[39][4]=1;
$xfigur[39][5]=2; $yfigur[39][5]=2;
# Wuerfelnetz 40
#########
# yyyyy#
# 01234#
#x0**...#
#x1.***.#
#x2..*..#
#x3.....#
#x4.....#
#########
$xfigur[40][0]=1; $yfigur[40][0]=3;
$xfigur[40][1]=2; $yfigur[40][1]=2;
$xfigur[40][2]=1; $yfigur[40][2]=1;
$xfigur[40][3]=1; $yfigur[40][3]=2;
$xfigur[40][4]=0; $yfigur[40][4]=0;
$xfigur[40][5]=0; $yfigur[40][5]=1;
# Wuerfelnetz 41
#########
# yyyyy#
# 01234#
#x0..*..#
#x1.**..#
#x2**...#
#x3.*...#
#x4.....#
#########
$xfigur[41][0]=0; $yfigur[41][0]=2;
$xfigur[41][1]=3; $yfigur[41][1]=1;
$xfigur[41][2]=2; $yfigur[41][2]=0;
$xfigur[41][3]=1; $yfigur[41][3]=1;
$xfigur[41][4]=2; $yfigur[41][4]=1;
$xfigur[41][5]=1; $yfigur[41][5]=2;
# Wuerfelnetz 42
#########
# yyyyy#
# 01234#
#x0.*...#
#x1***..#
#x2..**.#
#x3.....#
#x4.....#
#########
$xfigur[42][0]=2; $yfigur[42][0]=3;
$xfigur[42][1]=1; $yfigur[42][1]=0;
$xfigur[42][2]=1; $yfigur[42][2]=1;
$xfigur[42][3]=1; $yfigur[42][3]=2;
$xfigur[42][4]=2; $yfigur[42][4]=2;
$xfigur[42][5]=0; $yfigur[42][5]=1;
# Wuerfelnetz 43
#########
# yyyyy#
# 01234#
#x0.*...#
#x1.**..#
#x2**...#
#x3*....#
#x4.....#
#########
$xfigur[43][0]=1; $yfigur[43][0]=2;
$xfigur[43][1]=3; $yfigur[43][1]=0;
$xfigur[43][2]=0; $yfigur[43][2]=1;
$xfigur[43][3]=1; $yfigur[43][3]=1;
$xfigur[43][4]=2; $yfigur[43][4]=1;
$xfigur[43][5]=2; $yfigur[43][5]=0;
# Wuerfelnetz 44
#########
# yyyyy#
# 01234#
#x0..*..#
#x1.***.#
#x2**...#
#x3.....#
#x4.....#
#########
$xfigur[44][0]=1; $yfigur[44][0]=3;
$xfigur[44][1]=2; $yfigur[44][1]=0;
$xfigur[44][2]=1; $yfigur[44][2]=1;
$xfigur[44][3]=1; $yfigur[44][3]=2;
$xfigur[44][4]=0; $yfigur[44][4]=2;
$xfigur[44][5]=2; $yfigur[44][5]=1;
# Wuerfelnetz 45
#########
# yyyyy#
# 01234#
#x0*....#
#x1**...#
#x2.**..#
#x3.*...#
#x4.....#
#########
$xfigur[45][0]=2; $yfigur[45][0]=2;
$xfigur[45][1]=3; $yfigur[45][1]=1;
$xfigur[45][2]=1; $yfigur[45][2]=0;
$xfigur[45][3]=1; $yfigur[45][3]=1;
$xfigur[45][4]=2; $yfigur[45][4]=1;
$xfigur[45][5]=0; $yfigur[45][5]=0;
# Wuerfelnetz 46
#########
# yyyyy#
# 01234#
#x0..**.#
#x1***..#
#x2.*...#
#x3.....#
#x4.....#
#########
$xfigur[46][0]=0; $yfigur[46][0]=3;
$xfigur[46][1]=2; $yfigur[46][1]=1;
$xfigur[46][2]=1; $yfigur[46][2]=1;
$xfigur[46][3]=1; $yfigur[46][3]=2;
$xfigur[46][4]=0; $yfigur[46][4]=2;
$xfigur[46][5]=1; $yfigur[46][5]=0;
# Wuerfelnetz 47
#########
# yyyyy#
# 01234#
#x0.*...#
#x1**...#
#x2.**..#
#x3..*..#
#x4.....#
#########
$xfigur[47][0]=3; $yfigur[47][0]=2;
$xfigur[47][1]=1; $yfigur[47][1]=0;
$xfigur[47][2]=0; $yfigur[47][2]=1;
$xfigur[47][3]=1; $yfigur[47][3]=1;
$xfigur[47][4]=2; $yfigur[47][4]=1;
$xfigur[47][5]=2; $yfigur[47][5]=2;
# Wuerfelnetz 48
#########
# yyyyy#
# 01234#
#x0**...#
#x1.***.#
#x2...*.#
#x3.....#
#x4.....#
#########
$xfigur[48][0]=2; $yfigur[48][0]=3;
$xfigur[48][1]=0; $yfigur[48][1]=1;
$xfigur[48][2]=1; $yfigur[48][2]=1;
$xfigur[48][3]=1; $yfigur[48][3]=2;
$xfigur[48][4]=1; $yfigur[48][4]=3;
$xfigur[48][5]=0; $yfigur[48][5]=0;
# Wuerfelnetz 49
#########
# yyyyy#
# 01234#
#x0..*..#
#x1.**..#
#x2.*...#
#x3**...#
#x4.....#
#########
$xfigur[49][0]=0; $yfigur[49][0]=2;
$xfigur[49][1]=3; $yfigur[49][1]=1;
$xfigur[49][2]=3; $yfigur[49][2]=0;
$xfigur[49][3]=1; $yfigur[49][3]=1;
$xfigur[49][4]=2; $yfigur[49][4]=1;
$xfigur[49][5]=1; $yfigur[49][5]=2;
# Wuerfelnetz 50
#########
# yyyyy#
# 01234#
#x0*....#
#x1***..#
#x2..**.#
#x3.....#
#x4.....#
#########
$xfigur[50][0]=2; $yfigur[50][0]=3;
$xfigur[50][1]=1; $yfigur[50][1]=0;
$xfigur[50][2]=1; $yfigur[50][2]=1;
$xfigur[50][3]=1; $yfigur[50][3]=2;
$xfigur[50][4]=2; $yfigur[50][4]=2;
$xfigur[50][5]=0; $yfigur[50][5]=0;
# Wuerfelnetz 51
#########
# yyyyy#
# 01234#
#x0.**..#
#x1.*...#
#x2**...#
#x3*....#
#x4.....#
#########
$xfigur[51][0]=0; $yfigur[51][0]=2;
$xfigur[51][1]=3; $yfigur[51][1]=0;
$xfigur[51][2]=0; $yfigur[51][2]=1;
$xfigur[51][3]=1; $yfigur[51][3]=1;
$xfigur[51][4]=2; $yfigur[51][4]=1;
$xfigur[51][5]=2; $yfigur[51][5]=0;
# Wuerfelnetz 52
#########
# yyyyy#
# 01234#
#x0...*.#
#x1.***.#
#x2**...#
#x3.....#
#x4.....#
#########
$xfigur[52][0]=0; $yfigur[52][0]=3;
$xfigur[52][1]=2; $yfigur[52][1]=0;
$xfigur[52][2]=1; $yfigur[52][2]=1;
$xfigur[52][3]=1; $yfigur[52][3]=2;
$xfigur[52][4]=1; $yfigur[52][4]=3;
$xfigur[52][5]=2; $yfigur[52][5]=1;
# Wuerfelnetz 53
#########
# yyyyy#
# 01234#
#x0*....#
#x1**...#
#x2.*...#
#x3.**..#
#x4.....#
#########
$xfigur[53][0]=3; $yfigur[53][0]=2;
$xfigur[53][1]=0; $yfigur[53][1]=0;
$xfigur[53][2]=1; $yfigur[53][2]=0;
$xfigur[53][3]=1; $yfigur[53][3]=1;
$xfigur[53][4]=2; $yfigur[53][4]=1;
$xfigur[53][5]=3; $yfigur[53][5]=1;
# Wuerfelnetz 54
#########
# yyyyy#
# 01234#
#x0..**.#
#x1***..#
#x2*....#
#x3.....#
#x4.....#
#########
$xfigur[54][0]=0; $yfigur[54][0]=3;
$xfigur[54][1]=2; $yfigur[54][1]=0;
$xfigur[54][2]=1; $yfigur[54][2]=1;
$xfigur[54][3]=1; $yfigur[54][3]=2;
$xfigur[54][4]=0; $yfigur[54][4]=2;
$xfigur[54][5]=1; $yfigur[54][5]=0;
# Wuerfelnetz 55
#########
# yyyyy#
# 01234#
#x0**...#
#x1.*...#
#x2.**..#
#x3..*..#
#x4.....#
#########
$xfigur[55][0]=3; $yfigur[55][0]=2;
$xfigur[55][1]=0; $yfigur[55][1]=0;
$xfigur[55][2]=0; $yfigur[55][2]=1;
$xfigur[55][3]=1; $yfigur[55][3]=1;
$xfigur[55][4]=2; $yfigur[55][4]=1;
$xfigur[55][5]=2; $yfigur[55][5]=2;
# Wuerfelnetz 56
#########
# yyyyy#
# 01234#
#x0**...#
#x1.**..#
#x2..**.#
#x3.....#
#x4.....#
#########
$xfigur[56][0]=2; $yfigur[56][0]=3;
$xfigur[56][1]=0; $yfigur[56][1]=1;
$xfigur[56][2]=1; $yfigur[56][2]=1;
$xfigur[56][3]=1; $yfigur[56][3]=2;
$xfigur[56][4]=2; $yfigur[56][4]=2;
$xfigur[56][5]=0; $yfigur[56][5]=0;
# Wuerfelnetz 57
#########
# yyyyy#
# 01234#
#x0..*..#
#x1.**..#
#x2**...#
#x3*....#
#x4.....#
#########
$xfigur[57][0]=0; $yfigur[57][0]=2;
$xfigur[57][1]=3; $yfigur[57][1]=0;
$xfigur[57][2]=1; $yfigur[57][2]=2;
$xfigur[57][3]=1; $yfigur[57][3]=1;
$xfigur[57][4]=2; $yfigur[57][4]=1;
$xfigur[57][5]=2; $yfigur[57][5]=0;
# Wuerfelnetz 58
#########
# yyyyy#
# 01234#
#x0..**.#
#x1.**..#
#x2**...#
#x3.....#
#x4.....#
#########
$xfigur[58][0]=0; $yfigur[58][0]=3;
$xfigur[58][1]=2; $yfigur[58][1]=0;
$xfigur[58][2]=1; $yfigur[58][2]=1;
$xfigur[58][3]=1; $yfigur[58][3]=2;
$xfigur[58][4]=0; $yfigur[58][4]=2;
$xfigur[58][5]=2; $yfigur[58][5]=1;
# Wuerfelnetz 59
#########
# yyyyy#
# 01234#
#x0*....#
#x1**...#
#x2.**..#
#x3..*..#
#x4.....#
#########
$xfigur[59][0]=3; $yfigur[59][0]=2;
$xfigur[59][1]=0; $yfigur[59][1]=0;
$xfigur[59][2]=1; $yfigur[59][2]=0;
$xfigur[59][3]=1; $yfigur[59][3]=1;
$xfigur[59][4]=2; $yfigur[59][4]=1;
$xfigur[59][5]=2; $yfigur[59][5]=2;
# Wuerfelnetz 60
#########
# yyyyy#
# 01234#
#x0***..#
#x1..***#
#x2.....#
#x3.....#
#x4.....#
#########
$xfigur[60][0]=1; $yfigur[60][0]=4;
$xfigur[60][1]=0; $yfigur[60][1]=1;
$xfigur[60][2]=0; $yfigur[60][2]=2;
$xfigur[60][3]=1; $yfigur[60][3]=2;
$xfigur[60][4]=1; $yfigur[60][4]=3;
$xfigur[60][5]=0; $yfigur[60][5]=0;
# Wuerfelnetz 61
#########
# yyyyy#
# 01234#
#x0.*...#
#x1.*...#
#x2**...#
#x3*....#
#x4*....#
#########
$xfigur[61][0]=0; $yfigur[61][0]=1;
$xfigur[61][1]=4; $yfigur[61][1]=0;
$xfigur[61][2]=2; $yfigur[61][2]=1;
$xfigur[61][3]=2; $yfigur[61][3]=0;
$xfigur[61][4]=3; $yfigur[61][4]=0;
$xfigur[61][5]=1; $yfigur[61][5]=1;
# Wuerfelnetz 62
#########
# yyyyy#
# 01234#
#x0..***#
#x1***..#
#x2.....#
#x3.....#
#x4.....#
#########
$xfigur[62][0]=0; $yfigur[62][0]=4;
$xfigur[62][1]=1; $yfigur[62][1]=0;
$xfigur[62][2]=0; $yfigur[62][2]=2;
$xfigur[62][3]=0; $yfigur[62][3]=3;
$xfigur[62][4]=1; $yfigur[62][4]=1;
$xfigur[62][5]=1; $yfigur[62][5]=2;
# Wuerfelnetz 63
#########
# yyyyy#
# 01234#
#x0*....#
#x1*....#
#x2**...#
#x3.*...#
#x4.*...#
#########
$xfigur[63][0]=4; $yfigur[63][0]=1;
$xfigur[63][1]=1; $yfigur[63][1]=0;
$xfigur[63][2]=2; $yfigur[63][2]=0;
$xfigur[63][3]=2; $yfigur[63][3]=1;
$xfigur[63][4]=3; $yfigur[63][4]=1;
$xfigur[63][5]=0; $yfigur[63][5]=0;
}
# Programmstart
# Spielfelder initialisieren
init_felder;
# Wuerfelnetze laden
init_figuren;
# Hauptprogramm ausfuehren
mainproc(0);
|
| >>>Download wuerfelnetze.perl |
|
Das Hauptprogramm verfolgt nun folgende Strategie:
Die Funktion mainproc wird mit einer bestimmten Feldnummer (beim Start 0) gestartet und versucht nun alle verbleibenden Würfelnetze (beim Start alle von 0 bis 63) zu platzieren.
Dazu beginnt es im Spielfeld links oben an der Position x=0, y=0 und versucht das erste Netz zu platzieren.
Welches Netz und welche Position im aktuellen Spielfeld momentan getestet wird, wird in im Array netzinfo abgespeichert.
Wenn es an der getesteten Stelle keine Kollisionen gibt, dann kopiert es das aktuelle Spielfeld in ein Feld mit der nächsthöheren Feldnummer, setzt das Netz an der gefunden Position ab und ruft sich selbst mit der neuen Feldnummer auf.
Wenn es an der getesteten Stelle jedoch eine Kollision gibt, verfährt das Programm wie folgt:
1. Bei einer Kollision mit einer anderen Figur wird die nächste Stelle im Spielfeld getestet, also z.B. x=0, y=1.
2. Bei einer Kollision mit dem rechten Rand fährt das Programm auf der nächsten Zeile mit dem Test fort, also z.B. bei x=1, y=0.
3. Bei einer Kollision mit dem unteren Rand wird der Test mit dem nächsten Netz am Feldanfang x=0, y=0 fortgesetzt.
Wenn nun also z.B. alle Positionen des Netzes 0 ausprobiert wurden, wird in die netzinfo das nächste zu testende Netz eingetragen und deshalb nie wieder für einen weiteren Test verwendet.
Das wurde realisiert, indem mainproc den Startwert der Netztests immer aus der netzinfo des vorherigen Feldes läd.
Dadurch wird die Anzahl der insgesamt durchgeführten Tests erheblich reduziert und im Ergebnis entstehen weniger Doppelungen.
Durch die Iteration wird das Programm sehr klein und übersichtlich.
Leider sind Iterationen nicht so einfach zu verstehen wie normale Sequenzen, aber der Code ist wesentlich kürzer und eleganter.
|