Δημοσιεύτηκε: 04 Μαρ 2012, 14:45
από migf1
Ποστάρω τη λύση μου στα βιαστικά γιατί πρέπει να φύγω (ίσως να έχεi κάνα bug). Δείτε την και την συζητάμε σε κάνα 5ωρο που θα επσιτρέψω (π.χ. η συνάρτηση: pos_isblocked() μπορεί να βελτιστοποιηθεί ώστε να μη τσεκάρει και στις 4 κατευθύνσεις, αλλά να επσιτρέφει μόλις βρει την 1η κατεύθυνση που ΔΕΝ είναι μπλοκαρισμένη).

Επίσης, την έχω βάλει να τυπώνει τις μπλοκαρισμένες κατευθύνσεις της κάθε κίνησης...
Μορφοποιημένος Κώδικας: Επιλογή όλων
#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 );
}

ΥΓ. Άλλα αντί άλλων ο syntax-highlighter :lol: