οκ, θα προσπαθήσω να την κάνω κι εγώ για να βάλουμε μετά τους κώδικες δίπλα-δίπλα.
Θα την κάνω με 1Δ πίνακα εγώ (τον οποίον θα τον διαχειρίζομαι ως 2Δ... τσέκαρα πως το έχει καλύψει στο βιβλίο).
Συντονιστής: konnn

if (table[row+1][col] && table[row-1][col] && table[row][col+1] && table[row][col-1])
break;
migf1 έγραψε:Θα την κάνω με 1Δ πίνακα εγώ (τον οποίον θα τον διαχειρίζομαι ως 2Δ... τσέκαρα πως το έχει καλύψει στο βιβλίο).




int x; 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define NROWS 10
#define NCOLS 10
#define ROW(n) ( (n) / NCOLS )
#define COL(n) ( (n) % NCOLS )
#define POSUP(n) ( (n) - NCOLS )
#define POSDN(n) ( (n) + NCOLS )
#define POSLF(n) ( (n) - 1 )
#define POSRT(n) ( (n) + 1 )
#define MARKS "BCDEFGHIJKLMNOPQRSTUVWXYZ"
enum Dir { UP=0, DN, LF, RT };
/*********************************************************//**
*
************************************************************/
void tab_print( char tab[] )
{
for (int n=0; n < NROWS * NCOLS; n++)
{
if ( n != 0 && n % NCOLS == 0 )
putchar('\n');
putchar( tab[n] );
}
putchar('\n');
}
/*********************************************************//**
*
************************************************************/
int next_pos( const int pos, const enum Dir dir)
{
int ret = -1;
switch (dir)
{
case UP:
ret = ROW(pos) > 0 ? POSUP(pos) : -1;
break;
case DN:
ret = ROW(pos) < NROWS-1 ? POSDN(pos) : -1;
break;
case LF:
ret = COL(pos) > 0 ? POSLF(pos) : -1;
break;
case RT:
ret = COL(pos) < NCOLS-1 ? POSRT(pos) : -1;
break;
default:
break;
}
return ret;
}
/*********************************************************//**
*
************************************************************/
_Bool pos_isblocked( const int pos, const char tab[] )
{
int nblocked = 0;
if ( ROW(pos) == 0 || '.' != tab[ POSUP(pos) ] )
nblocked++;
if ( ROW(pos) == NROWS-1 || '.' != tab[ POSDN(pos) ] )
nblocked++;
if ( COL(pos) == 0 || '.' != tab[ POSLF(pos) ] )
nblocked++;
if ( COL(pos) == NCOLS-1 || '.' != tab[ POSRT(pos) ] )
nblocked++;
printf("%c: nblocked = %d\n", tab[pos], nblocked );
return 4 == nblocked;
}
/*********************************************************//**
*
************************************************************/
int main( void )
{
int movesleft, mvcount=0, pos=0;
char tab[ NROWS * NCOLS ];
srand( (unsigned)time(NULL) ); /* init pseudo-random seed */
memset( tab, '.', sizeof(tab) ); /* init table with dots */
tab[0] = 'A';
movesleft = strlen(MARKS);
while ( movesleft )
{
int try = 0;
if ( pos_isblocked(pos, tab) )
break;
do {
try = next_pos( pos, rand() % 4 );
} while ( -1 == try || '.' != tab[try] );
pos = try;
tab[ pos ] = MARKS[ mvcount++ ];
movesleft--;
}
tab_print( tab );
exit( EXIT_SUCCESS );
}

migf1 έγραψε:π.χ. η συνάρτηση: pos_isblocked() μπορεί να βελτιστοποιηθεί ώστε να μη τσεκάρει και στις 4 κατευθύνσεις, αλλά να επσιτρέφει μόλις βρει την 1η κατεύθυνση που ΔΕΝ είναι μπλοκαρισμένη
_Bool pos_isblocked( const int pos, const char tab[] )
{
return (ROW(pos) == 0 || '.' != tab[POSUP(pos)]) && (ROW(pos) == NROWS-1 || '.' != tab[POSDN(pos)]) && (COL(pos) == 0 || '.' != tab[POSLF(pos)]) && (COL(pos) == NCOLS-1 || '.' != tab[POSRT(pos)]);
}

const char alphabeta[] = {'A', 'B', 'C', 'D', 'E'};char alphabeta[5] = {'A', 'B', 'C', 'D', 'E'};