Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Puzzle solver - mala modifikacija

[es] :: C/C++ programiranje :: Puzzle solver - mala modifikacija

[ Pregleda: 2725 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Vladica Savić
Software Developer
Toronto, Canada

Član broj: 26699
Poruke: 654



+5 Profil

icon Puzzle solver - mala modifikacija11.08.2008. u 11:45 - pre 191 meseci
Nasao sam ovaj kod na netu na ovoj lokaciji
Nisam pored svog kompa tako da ne mogu jos da probam da iskompajliram ovaj kod, ali koliko vidim on resava iz nekog stanja slagalice u stanje:
0 1 2
3 4 5
6 7 8

a meni treba u stanje

1 2 3
8 0 4
7 6 5

...sta treba i gde da se izmeni ovde?

Code:
/************************************************/
/* CS3361: Assignment 2. Solve an eight puzzle. */
/************************************************/
/* INCLUDES */

#include &ltstdio.h>

/************************************************/
/* DEFINES */

#define FALSE 0
#define TRUE 1
#define N_POSITIONS 9
#define MAX_N_MOVES 4
#define NO_FLAGS 0
#define ON_SOLUTION_PATH 1
#define NO_SOLUTION 0
#define FOUND_SOLUTION 1
#define HOLE 0
#define NO_PIECE 255

/************************************************/
/* TYPEDEFS */

/* The state will be a vector of 9 integers
(stored in unsigned chars).
4 2 6
1 3 _
5 8 7
is represented as
{ 4, 2, 6, 1, 3, 0, 5, 8, 7}
*/

typedef unsigned char STATE[ N_POSITIONS ];

/* A node in the search tree: */

typedef struct node
{
  STATE state;
  unsigned char piece_moved;
  struct node *sibling;
  struct node *first_child;
  struct node *parent;
  int flags;
}
NODE;

/************************************************/
/* GLOBALS */

/* First, let's put the rules in a lookup table.
We index the table by where the hole is, and look
up which positions the hole can move to.
The square indices are
0 1 2
3 4 5
6 7 8
A -1 in an entry indicates that that position does not
have this many moves.
*/

int moves[ N_POSITIONS ][ MAX_N_MOVES ] =
{
/* From 0: */  { 1, 3, -1, -1 },
/* From 1: */  { 0, 2, 4, -1 },
/* From 2: */  { 1, 5, -1, -1 },
/* From 3: */  { 0, 4, 6, -1},
/* From 4: */  { 1, 3, 5, 7},
/* From 5: */  { 2, 4, 8, -1},
/* From 6: */  { 3, 7, -1, -1},
/* From 7: */  { 4, 6, 8, -1},
/* From 8: */  { 5, 7, -1, -1}
};

/* We need to know what the solution should look like: */
int solution[ N_POSITIONS ] = { 1, 2, 3, 4, 5, 6, 7, 8, 0 };

int n_nodes = 0; /* Keep count of the number of nodes created. */

/************************************************/
/* MAIN */

main()
{
  NODE *search_tree, *solution;
  NODE *malloc_node();
  int depth;

  /*
  printf( "A node is %d bytes\n", sizeof( NODE ) );
  */

  search_tree = malloc_node();

  read_initial_state( search_tree->state );
  for( depth = 1; depth state[i] = i;
  node->piece_moved = NO_PIECE;
  node->sibling = NULL;
  node->first_child = NULL;
  node->parent = NULL;
  node->flags = NO_FLAGS;

  n_nodes++;
  return node;
}

/************************************************/

read_initial_state( state )
     STATE state;
{
  int i;
  int value;
  int repeats[N_POSITIONS];

  printf( "Please type in the initial position of the squares\n" );
  printf( "Give each row from top to bottom in left to right order\n" );
  for( i = 0; i  8 )
    {
      fprintf( stderr,
      "Illegal value %d in position %d, values must between 0 and 8.\n",
          value, i );
      exit( -1 );
    }
      if ( repeats[value] > 0 )
    {
      fprintf( stderr, "Duplicate value %d in position %d.\n", value, i );
      exit( -1 );
    }
      repeats[value] = 1;
      state[i] = (unsigned char) value; /* Do type conversion */
    }
  printf( "Input read:\n" );
  print_board( state );
}

/************************************************/

print_board( state )
     STATE state;
{
  printf( "%d %d %d\n", state[0], state[1], state[2] );
  printf( "%d %d %d\n", state[3], state[4], state[5] );
  printf( "%d %d %d\n", state[6], state[7], state[8] );
}

/************************************************/
/* Recursive version: Beware of stack overflow */

expand_search_tree_by_one( node )
     NODE *node;
{

  if ( node == NULL )
    {
      fprintf( stderr, "Consistency check 1 failed\n" );
      exit( -1 );
    }
  if ( node->first_child == NULL )
    generate_moves( node );
  else
    expand_search_tree_by_one( node->first_child );

  /* Propagate solution */
  if ( on_solution_path( node ) && node->parent != NULL )
    {
      node->parent->flags |= ON_SOLUTION_PATH;
      return;
    }

  if ( node->sibling != NULL )
    expand_search_tree_by_one( node->sibling );
}

/************************************************/

generate_moves( node )
     NODE *node;
{
  NODE *make_move();
  NODE *child;
  int i;

  child = make_move( node, 0 );
  node->first_child = child;
  if ( is_solution( child ) )
    {
      node->flags |= ON_SOLUTION_PATH;
      return FOUND_SOLUTION;
    }
  for( i = 1; i sibling = make_move( node, i );
      if ( child->sibling == NULL )
    return NO_SOLUTION;
      if ( is_solution( child->sibling ) )
    {
      node->flags |= ON_SOLUTION_PATH;
      return FOUND_SOLUTION;
    }
      child = child->sibling;
    }
  return NO_SOLUTION;
}

/************************************************/

NODE *make_move( node, index )
     NODE *node;
     int index;
{
  int i, hole_position, piece_position;
  NODE *result;

  /* Find hole */
  for( i = 0; i state[i] == HOLE )
    break;
    }
  hole_position = i;
  piece_position = moves[hole_position][index];
  if ( piece_position parent = node;
  for( i = 0; i state[i] = node->state[i];
    }
  /* Swap hole and other piece. */
  result->state[hole_position] = node->state[piece_position];
  result->state[piece_position] = node->state[hole_position];
  result->piece_moved = node->state[piece_position];

  /*
  printf( "From\n" );
  print_board( node->state );
  printf( "Generating\n" );
  print_board( result->state );
  */

  return result;
}

/************************************************/

is_solution( node )
     NODE *node;
{
  int i;

  for( i = 0; i state[i] != solution[i] )
    return FALSE;
    }
  node->flags |= ON_SOLUTION_PATH;
  return TRUE;
}

/************************************************/

on_solution_path( node )
     NODE *node;
{
  if ( ( node->flags & ON_SOLUTION_PATH ) == 0 )
    return FALSE;
  else
    return TRUE;
}

/************************************************/

print_out_solution( node )
     NODE *node;
{
  if ( node == NULL )
    return;
  if ( on_solution_path( node ) )
    {
      if ( node->piece_moved != NO_PIECE )
    {
      printf( "Piece %d moved.\n", node->piece_moved );
      print_board( node );
    }
      else
    {
      printf( "Starting postion:\n" );
      print_board( node );
    }
      print_out_solution( node->first_child );
    }
  else
    print_out_solution( node->sibling );
}

/************************************************/

PS-Slican problem sam postavio u jos nekoj temi ali u drugim delovima foruma, ali bih zamolio da se do resenja ne brisu.
(bicete blagovremeno obavesteni ako u medjuvremenu nadjem resenje). Hvala na razumevanju.
 
Odgovor na temu

peromalosutra
Ivan Rajkovic
Software engineer
Luxoft
Berlin

Član broj: 54774
Poruke: 871
*.teol.net.



+148 Profil

icon Re: Puzzle solver - mala modifikacija11.08.2008. u 17:15 - pre 190 meseci
Code:
/* We need to know what the solution should look like: */
int solution[ N_POSITIONS ] = { 1, 2, 3, 4, 5, 6, 7, 8, 0 };


Zar ti ovo ne djeluje sumnjivo? :)

 
Odgovor na temu

Vladica Savić
Software Developer
Toronto, Canada

Član broj: 26699
Poruke: 654



+5 Profil

icon Re: Puzzle solver - mala modifikacija11.08.2008. u 18:23 - pre 190 meseci
Da li si uspeo da iskompajliras ovu skritpu?
I ja sam pomislio da je taj deo, ali me zbunilo ovo:

Citat:
/* First, let's put the rules in a lookup table.
We index the table by where the hole is, and look
up which positions the hole can move to.
The square indices are
0 1 2
3 4 5
6 7 8
A -1 in an entry indicates that that position does not
have this many moves.
*/


...i ovo :)

Citat:
int moves[ N_POSITIONS ][ MAX_N_MOVES ] =
{
/* From 0: */ { 1, 3, -1, -1 },
/* From 1: */ { 0, 2, 4, -1 },
/* From 2: */ { 1, 5, -1, -1 },
/* From 3: */ { 0, 4, 6, -1},
/* From 4: */ { 1, 3, 5, 7},
/* From 5: */ { 2, 4, 8, -1},
/* From 6: */ { 3, 7, -1, -1},
/* From 7: */ { 4, 6, 8, -1},
/* From 8: */ { 5, 7, -1, -1}
};


Mislio sam na prvi pogled da to ima veze sa finalnim stanjem, pa mi je zato bio cudan taj deo koji si naveo :)

Citat:
/* We need to know what the solution should look like: */
int solution[ N_POSITIONS ] = { 1, 2, 3, 4, 5, 6, 7, 8, 0 };


Ja nikako da uspem da iskompajliram ovu skriptu?

Da li si ti uspeo?
 
Odgovor na temu

mulaz
Ljubljana

Član broj: 47602
Poruke: 2239
*.dial-up.dsl.siol.net.

Jabber: mulaz@elitesecurity.org
Sajt: www.mulaz.org


+184 Profil

icon Re: Puzzle solver - mala modifikacija11.08.2008. u 18:41 - pre 190 meseci
jesi popravio &lt; i napisao '<' i sl? :)


edit... brzo ispod MAIN je jedna for zanka bez ')' i ima jos par takvih gresaka
Bolje ispasti glup nego iz aviona
http://www.mulaz.org/
 
Odgovor na temu

Vladica Savić
Software Developer
Toronto, Canada

Član broj: 26699
Poruke: 654



+5 Profil

icon Re: Puzzle solver - mala modifikacija11.08.2008. u 20:19 - pre 190 meseci
Ma stavio sam, ali opet nece da prodje, a kod one for petlje ispod main-a videh gresku ali kako god da je ispravim opet mi prijavljuje isto, a nikako da pohvatam sve da ispoispravljam jer ni ne poznajem dovoljno dobro c sintaksu

Jel ima jos koja greska koju je neko uocio da konacno prodje ovaj *** compile kroz ovo valjano...
 
Odgovor na temu

del-boy
Bojan Delić
Beograd

Član broj: 9330
Poruke: 1089

Sajt: www.delic.in.rs


+21 Profil

icon Re: Puzzle solver - mala modifikacija11.08.2008. u 21:45 - pre 190 meseci
Ovaj kod sam ja koristio da bih napisao program za traženje najkraćeg puta kroz lavirint za neke vežbe. Ovde imaš 5 algoritama, pa pokušaj da izvučeš onaj koji ti najviše odgovara.

Ja nisam uspeo kod da kompajliram gcc-om (mislim da je pisan za borlandov kompajler), ali nije mi ni trebao jer sam pisao sasvim drugi program, samo su mi algoritmi trebali...
Prikačeni fajlovi
 
Odgovor na temu

Vladica Savić
Software Developer
Toronto, Canada

Član broj: 26699
Poruke: 654



+5 Profil

icon Re: Puzzle solver - mala modifikacija12.08.2008. u 18:10 - pre 190 meseci
Ni ja nikako da iskompajliram ni ovo sto si mi poslao, a probao sam AStar jer je to u sustini jedno te isto sto i Best-First, ali mucak

A ni ovaj kod od gore nikako da proradi...

F1 F1 F1
(H E L P)
 
Odgovor na temu

del-boy
Bojan Delić
Beograd

Član broj: 9330
Poruke: 1089

Sajt: www.delic.in.rs


+21 Profil

icon Re: Puzzle solver - mala modifikacija13.08.2008. u 02:06 - pre 190 meseci
Probaj sa ovim... http://wiki.delic.in.rs/doku.php/fax:pretrage

Trebalo bi da radi, davno beše od kad sam ga pisao... I zaboravio sam da sam ga tu uploadovao...
 
Odgovor na temu

Vladica Savić
Software Developer
Toronto, Canada

Član broj: 26699
Poruke: 654



+5 Profil

icon Re: Puzzle solver - mala modifikacija14.08.2008. u 17:36 - pre 190 meseci
Kod mene nece ni ovo da radi?

Uzgred, ovo je u C++-u, a meni treba u C-u :(
 
Odgovor na temu

del-boy
Bojan Delić
Beograd

Član broj: 9330
Poruke: 1089

Sajt: www.delic.in.rs


+21 Profil

icon Re: Puzzle solver - mala modifikacija15.08.2008. u 14:38 - pre 190 meseci
Ne znam, ja sam ga kompajlirao bez problema pre koji minut, uz izmenu koja stoji na linku koji sam ti dao.

A to što ti treba C, a ne C++ je druga stvar. Uzmi i skontaj jedan od ovih algoritama i samo ga prepiši u C. U suštini izvuci metode u funkcije i polja u strukture i uz manje izmene će raditi...
 
Odgovor na temu

[es] :: C/C++ programiranje :: Puzzle solver - mala modifikacija

[ Pregleda: 2725 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.