Colin MacLaren
2013-01-24, 19:43:50
Hey, ich versuche mich gerade am Rausschmeißer des ersten Semesters, der Rekursion ;)
Ziel ist das klassische Damenproblem. Wir haben ein Schachbrett mit 8x8 Feldern und versuchen darauf acht Damen so zu platzieren, dass keine die andere bedroht.
Die Idee war, iterativ in einer Zeile in jeder Spalte eine Dame zu platzieren, zu checken, ob bereits gesetzte Damen diese bedrohen und wenn dies nicht der Fall ist, eine Zeile nach unten zu gehen und dort mit der Rekursion fortzufahren. Die Abbruchbedingung ist eine gültig gesetzte Dame in der letzten Zeile, dann erfolgt die Ausgabe des Schachbretts und es geht wieder eine stufe tiefer.
Leider gibt mein Algorithmus genau gar nichts aus.
#include <stdio.h>
#include <stdlib.h>
//Testet, ob in der aktuellen Spalte oder auf den absteigenden Diagonalen eine andere Dame sitzt.
int DameOK(int feld[][8], int zeile, int spalte)
{
int i;
for ( i = 0 ; i < zeile; i++ )
if ( feld[i][spalte] )
return 0;
for (i = 1; zeile - i >= 0, spalte - i >= 0 ; i++ )
if ( feld[zeile-i][spalte-i] )
return 0;
for (i = 1; zeile - i >= 0, spalte + i <= 7 ; i++ )
if ( feld[zeile-i][spalte+i] )
return 0;
return 1;
}
//Darstellung des Schachbretts
void ausgabe(int feld[][8])
{
int i, j;
printf("+--+--+--+--+--+--+--+--+");
for (i = 0; i <= 7; i++)
{
printf("\n|");
for (j = 0; j <= 7; j++)
{
if ( feld[i][j] == 0)
printf(" |");
else
printf(" D|");
}
printf("\n+--+--+--+--+--+--+--+--+");
}
printf("\n\n");
}
int rekursion(int feld[][8], int zeile)
{
int i;
for ( i = 0 ; i <= 7 ; i++ )
{
if ( DameOK(feld, zeile, i) )
{
feld[zeile][i] = 1;
if ( zeile == 7 )
ausgabe(feld);
else
rekursion(feld, zeile + 1);
feld[zeile][i] = 0;
}
}
return 0;
}
void main()
{
int feld[8][8];
int i, j;
for (i = 0; i <= 7; i++)
for (j = 0; j <= 7; j++)
feld[i][j] = 0;
rekursion(feld, 0);
return;
}
Ziel ist das klassische Damenproblem. Wir haben ein Schachbrett mit 8x8 Feldern und versuchen darauf acht Damen so zu platzieren, dass keine die andere bedroht.
Die Idee war, iterativ in einer Zeile in jeder Spalte eine Dame zu platzieren, zu checken, ob bereits gesetzte Damen diese bedrohen und wenn dies nicht der Fall ist, eine Zeile nach unten zu gehen und dort mit der Rekursion fortzufahren. Die Abbruchbedingung ist eine gültig gesetzte Dame in der letzten Zeile, dann erfolgt die Ausgabe des Schachbretts und es geht wieder eine stufe tiefer.
Leider gibt mein Algorithmus genau gar nichts aus.
#include <stdio.h>
#include <stdlib.h>
//Testet, ob in der aktuellen Spalte oder auf den absteigenden Diagonalen eine andere Dame sitzt.
int DameOK(int feld[][8], int zeile, int spalte)
{
int i;
for ( i = 0 ; i < zeile; i++ )
if ( feld[i][spalte] )
return 0;
for (i = 1; zeile - i >= 0, spalte - i >= 0 ; i++ )
if ( feld[zeile-i][spalte-i] )
return 0;
for (i = 1; zeile - i >= 0, spalte + i <= 7 ; i++ )
if ( feld[zeile-i][spalte+i] )
return 0;
return 1;
}
//Darstellung des Schachbretts
void ausgabe(int feld[][8])
{
int i, j;
printf("+--+--+--+--+--+--+--+--+");
for (i = 0; i <= 7; i++)
{
printf("\n|");
for (j = 0; j <= 7; j++)
{
if ( feld[i][j] == 0)
printf(" |");
else
printf(" D|");
}
printf("\n+--+--+--+--+--+--+--+--+");
}
printf("\n\n");
}
int rekursion(int feld[][8], int zeile)
{
int i;
for ( i = 0 ; i <= 7 ; i++ )
{
if ( DameOK(feld, zeile, i) )
{
feld[zeile][i] = 1;
if ( zeile == 7 )
ausgabe(feld);
else
rekursion(feld, zeile + 1);
feld[zeile][i] = 0;
}
}
return 0;
}
void main()
{
int feld[8][8];
int i, j;
for (i = 0; i <= 7; i++)
for (j = 0; j <= 7; j++)
feld[i][j] = 0;
rekursion(feld, 0);
return;
}