Indice del forum
 FAQ   Cerca   Lista utenti   Gruppi   Registrati   Profilo   Messaggi privati   Log in 
Progetto in C per risoluzione di un Hitori (simile al sudoku
Vai a 1, 2  Successivo
 
Nuovo argomento   Rispondi    Indice del forum -> Programmazione: c#, c++, Java, HTML, PHP, Javascript...
Precedente :: Successivo  

Autore

Messaggio

garfa
Bravino


Registrato: 09/06/09 15:48
Messaggi: 14

MessaggioInviato: Mar Giu 09, 2009 3:59 pm    Oggetto: Progetto in C per risoluzione di un Hitori (simile al sudoku

Rispondi citando


Ciao ragazzi!!!!!! mi servirebbe una mano per capire come poter memorizzare una griglia di numeri esempio:
1 1 1 2 3
5 4 2 3 1
1 5 3 4 3
2 4 4 1 4
1 2 1 5 4
in questo caso di dimensione 5x5 , ma può essere anche più grande!!!
scopo del gioco è annerire le caselle in modo che ogni numero compaia una volta per ogni riga e per ogni colonna, 2 caselle nere possono avere al amssimo un vertice in comune, le caselle non annerite devono formare una sola componente connessa verticalmente e orizzontalmente ovvero non devono esserci gruppi di caselle isolate.
Qiundi soluzione:
0 1 0 2 0
5 4 2 3 1
1 5 0 4 3 soluzione ottenuta tramite implementazione delle tecniche
2 0 4 1 0 che sono da implementare!!!
0 2 1 5 4
Dovrei farlo tramite una struttura dati tipo albero, albero red-black, grafo, come faccio a passare i valori letti in input e memorizzarli nell'albero red-black?????

Top

Profilo Invia messaggio privato

cali1981
Site Admin


Registrato: 16/01/06 22:01
Messaggi: 836

MessaggioInviato: Mer Giu 10, 2009 8:27 am    Oggetto:

Rispondi citando


Ciao, innanzitutto hai già implementato (o trovato implementato) l'albero red-black? Poi, dai valori originali, come fai a salvarli in un albero binario, mantenendo la posizione?
_________________
Visita anche il sito Agriturismo Umbria per maggiori informazioni sull'Umbria!

Realizzazione siti web e applicazioni ASp.NEt, C/C++, C#

Top

Profilo Invia messaggio privato Invia e-mail

garfa
Bravino


Registrato: 09/06/09 15:48
Messaggi: 14

MessaggioInviato: Mer Giu 10, 2009 11:54 am    Oggetto:

Rispondi citando


I valori della griglia li leggo dallo standard input (stdin) e mantengo la posizione attraverso un indice,ogni casella è rappresentata da una coppia (i,j), dove i>=0 e j<=n-1

la struttura per l'albero red-black è una cosa del genere :

Codice:
/***********************
*        rbtree.h      *
***********************/

#include <stdio.h>
#include <stdlib.h>

typedef int key;

typedef enum { red, black } color;

struct rbnode {
   key v;
   color c;
   struct rbnode *left, *right, *up;
};

typedef struct rbnode rbnode;

typedef struct {
   rbnode *root, *nil;
} rbtree;

rbtree *createrbtree(void);

void inorder(rbtree *p, void (*op)(rbnode *));

rbnode *search(rbtree *p, key k);

rbnode *treemin(rbtree *p);

rbnode *treemax(rbtree *p);

rbnode *treesucc(rbtree *r, rbnode *q);

rbnode *treepred(rbtree *r, rbnode *q);

void rbinsert(rbtree *p, key k);

void rbdelete(rbtree *r, rbnode *q);

/* end of file rbtree.h */

/*************************
*        rbtree.c        *
*************************/

#include "rbtree.h"

rbtree *createrbtree(void)
{
   rbtree *t = malloc(sizeof(rbtree));

   if(!t) {
      fprintf(stderr,"Errore di allocazione A\n");
           exit(-1);
   }
   if(!(t->root = malloc(sizeof(rbnode)))) {
      fprintf(stderr,"Errore di allocazione B\n");
           exit(-2);
   }
   t->nil = t->root;
   t->nil->left = t->nil->right = t->nil->up = t->nil;
   t->nil->c = black;
   return t;
}

void inord(rbnode *p, rbnode *nil, void (*op)(rbnode *))
{
   if(p != nil) {
           inord(p->left,nil,op);
      (*op)(p);
           inord(p->right,nil,op);
   }
}

void inorder(rbtree *p, void (*op)(rbnode *))
{
   inord(p->root, p->nil, op);
}


rbnode *search(rbtree *r, key k)
{
   rbnode *p = r->root;

   while(p != r->nil && k != p->v)
      p = k < p->v ? p->left : p->right;
   return p == r->nil ? NULL : p;
}

rbnode *rbtmin(rbnode *p, rbnode *nil)
{
   for(;p->left != nil;p = p->left);
   return p;
}

rbnode *rbtmax(rbnode *p, rbnode *nil)
{
   for(;p->right != nil;p = p->right);
   return p;
}

rbnode *treemin(rbtree *r)
{
   return rbtmin(r->root,r->nil);
}

rbnode *treemax(rbtree *r)
{
   return rbtmax(r->root,r->nil);
}

rbnode *treesucc(rbtree *r, rbnode *q)
{
   rbnode *qq;

   if(q->right != r->nil)
      return rbtmin(q->right,r->nil);
   qq = q->up;   
   while(qq != r->nil && q == qq->right) {
      q = qq;
      qq = qq->up;
   }
   return qq == r->nil ? NULL : qq;
}

rbnode *treepred(rbtree *r, rbnode *q)
{
   rbnode *qq;

   if(q->left != r->nil)
      return rbtmax(q->left,r->nil);
   qq = q->up;   
   while(qq != r->nil && q == qq->left) {
      q = qq;
      qq = qq->up;
   }
   return qq == r->nil ? NULL : qq;
}

void leftrotate(rbtree *r, rbnode *x)
{
   rbnode *y = x->right;
   
   x->right = y->left;
   if(y->left != r->nil)
      y->left->up = x;
   y->up = x->up;
   if(x->up == r->nil)
      r->root = y;
   else
      if(x == x->up->left)
         y->up->left = y;
      else
         y->up->right = y;
   y->left = x;
   x->up = y;
}

void rightrotate(rbtree *r, rbnode *x)
{
   rbnode *y = x->left;
   
   x->left = y->right;
   if(y->right != r->nil)
      y->right->up = x;
   y->up = x->up;
   if(x->up == r->nil)
      r->root = y;
   else
      if(x == x->up->right)
         y->up->right = y;
      else
         y->up->left = y;
   y->right = x;
   x->up = y;
}            

rbnode *simpleinsert(rbtree *tree, key k)
{
   rbnode *q = malloc(sizeof(rbnode));
   rbnode *r = tree->root;
   rbnode *s = tree->nil;

   if(!q) {
      fprintf(stderr,"Errore di allocazione C\n");
           exit(-4);
   }
   q->v = k;
   q->left = q->right = tree->nil;
   q->c = red;
   while(r != tree->nil) {
      s = r;
      r = k < r->v ? r->left : r->right;
   }
   q->up = s;
   if(s == tree->nil)
      return tree->root = q;
   if(k < s->v)
      s->left = q;
   else
      s->right = q;
   return q;
}

void rbinsert(rbtree *tree, key k)
{
   rbnode *x = simpleinsert(tree, k);
   rbnode *y;

   while(x != tree->root && x->up->c == red) {
      if(x->up == x->up->up->left) {                 /* caso L */
         y = x->up->up->right;
         if(y->c == red) {
            x->up->c = black;                  /* caso 1L */
            y->c = black;                      /* caso 1L */
            x->up->up->c = red;                /* caso 1L */
            x = x->up->up;                     /* caso 1L */
         } else {
            if(x == x->up->right)              /* caso 2L */
               leftrotate(tree,x = x->up);  /* caso 2L */            
            x->up->c = black;                  /* caso 3L */
            x->up->up->c = red;                /* caso 3L */
            rightrotate(tree,x->up->up);       /* caso 3L */
         }
      } else {                                       /* caso R */
         y = x->up->up->left;
         if(y->c == red) {
            x->up->c = black;                  /* caso 1R */
            y->c = black;                      /* caso 1R */
            x->up->up->c = red;                /* caso 1R */
            x = x->up->up;                     /* caso 1R */
         } else {
            if(x == x->up->left)               /* caso 2R */
               rightrotate(tree,x = x->up); /* caso 2R */               
            x->up->c = black;                  /* caso 3R */
            x->up->up->c = red;                /* caso 3R */
            leftrotate(tree,x->up->up);        /* caso 3R */
         }
      }
   }
   tree->root->c = black;
}

void fixup(rbtree *tree, rbnode *x)
{
   rbnode *w;

   while(x != tree->root && x->c == black) {
      if(x == x->up->left) {                                    /* caso L */
         if((w = x->up->right)->c == red) {
            w->c = black;                                 /* caso 1L */
            x->up->c = red;                               /* caso 1L */
            leftrotate(tree,x->up);                       /* caso 1L */
            w = x->up->right;                             /* caso 1L */
         }
         if(w->left->c == black && w->right->c == black) {
            w->c = red;                                   /* caso 2L */
            x = x->up;                                    /* caso 2L */
         } else {
            if(w->right->c == black) {
               w->left->c = black;                     /* caso 3L */
               w->c = red;                             /* caso 3L */
               rightrotate(tree,w);                    /* caso 3L */
               w = x->up->right;                       /* caso 3L */
            }
            w->c = x->up->c;                              /* caso 4L */
            x->up->c = black;                             /* caso 4L */
            w->right->c = black;                          /* caso 4L */
            leftrotate(tree,x->up);                       /* caso 4L */
            x = tree->root;                               /* caso 4L */
         }
      } else {                                                  /* caso R */
         if((w = x->up->left)->c == red) {                   
            w->c = black;                                 /* caso 1R */
            x->up->c = red;                               /* caso 1R */
            rightrotate(tree,x->up);                      /* caso 1R */
            w = x->up->left;                              /* caso 1R */
         }
         if(w->right->c == black && w->left->c == black) {
            w->c = red;                                   /* caso 2R */
            x = x->up;                                    /* caso 2R */
         } else {
            if(w->left->c == black) {
               w->right->c = black;                    /* caso 3R */
               w->c = red;                             /* caso 3R */
               leftrotate(tree,w);                     /* caso 3R */
               w = x->up->left;                        /* caso 3R */
            }
            w->c = x->up->c;                              /* caso 4R */
            x->up->c = black;                             /* caso 4R */
            w->left->c = black;                           /* caso 4R */
            rightrotate(tree,x->up);                      /* caso 4R */
            x = tree->root;                               /* caso 4R */
         }
      }
   }
   x->c = black;
}

void rbdelete(rbtree *tree, rbnode *q)
{
   rbnode *r, *s;

   if(q->left == tree->nil || q->right == tree->nil)
      r = q;
   else
      r = treesucc(tree,q);
   s = r->left != tree->nil ? r->left : r->right;
   s->up = r->up;
   if(r->up == tree->nil)
      tree->root = s;
   else
      if(r == r->up->left)
         r->up->left = s;
      else
         r->up->right = s;
   if(r != q)
      q->v = r->v;
   if(r->c == black)
      fixup(tree, s);    
   free(r);
}

Top

Profilo Invia messaggio privato

cali1981
Site Admin


Registrato: 16/01/06 22:01
Messaggi: 836

MessaggioInviato: Mer Giu 10, 2009 1:07 pm    Oggetto:

Rispondi citando


Ok, ma quando inserisci un valore nell'albero, come pensi di inserirlo? Cioè, puoi inserire il valore in key, ma poi non perdi le informazioni sugli indici?
_________________
Visita anche il sito Agriturismo Umbria per maggiori informazioni sull'Umbria!

Realizzazione siti web e applicazioni ASp.NEt, C/C++, C#

Top

Profilo Invia messaggio privato Invia e-mail

garfa
Bravino


Registrato: 09/06/09 15:48
Messaggi: 14

MessaggioInviato: Mer Giu 10, 2009 1:56 pm    Oggetto:

Rispondi citando


Se metto nella struttura della cella sia le coordinate che il numero?!!
Codice:

typedef struct rbnode{
        int numero;   //numero reale della casella
   int x,y;       // coordinate i,j
   color colore_nodo;
   struct cella *left, *right, *up;
}rbnode;

Top

Profilo Invia messaggio privato

cali1981
Site Admin


Registrato: 16/01/06 22:01
Messaggi: 836

MessaggioInviato: Mer Giu 10, 2009 2:05 pm    Oggetto:

Rispondi citando


Puoi provare anche così, ma non cambiare i campi che poi usa l'algoritmo, aggiungi e basta.
_________________
Visita anche il sito Agriturismo Umbria per maggiori informazioni sull'Umbria!

Realizzazione siti web e applicazioni ASp.NEt, C/C++, C#

Top

Profilo Invia messaggio privato Invia e-mail

garfa
Bravino


Registrato: 09/06/09 15:48
Messaggi: 14

MessaggioInviato: Mer Giu 10, 2009 2:26 pm    Oggetto:

Rispondi citando


Non è che mi puoi dare una mano per la lettura dei numeri
devo metterli in una matrice, una lista o qualcosa del genere o li leggo e li inserisco nell'albero....come faccio a metterli nella struttura dell'albero????

Top

Profilo Invia messaggio privato

cali1981
Site Admin


Registrato: 16/01/06 22:01
Messaggi: 836

MessaggioInviato: Mer Giu 10, 2009 2:32 pm    Oggetto:

Rispondi citando


Il problema è il cin? Per la struttura, devi crearla e cambiare il typedef come ti dicevo, ma poi dovresti andare a controllare dentro ogni funzione quando usa k, oppure creare gli operatori < > = per la struttura.
_________________
Visita anche il sito Agriturismo Umbria per maggiori informazioni sull'Umbria!

Realizzazione siti web e applicazioni ASp.NEt, C/C++, C#

Top

Profilo Invia messaggio privato Invia e-mail

garfa
Bravino


Registrato: 09/06/09 15:48
Messaggi: 14

MessaggioInviato: Mer Giu 10, 2009 2:36 pm    Oggetto:

Rispondi citando


non ho capito questa domanda.........Il problema è il cin?

Top

Profilo Invia messaggio privato

cali1981
Site Admin


Registrato: 16/01/06 22:01
Messaggi: 836

MessaggioInviato: Mer Giu 10, 2009 2:40 pm    Oggetto:

Rispondi citando


Hai chiesto, mi aiuti a leggere i numeri? Chiedo, il problema è come usare il cin per leggere l'intero inserito dall'utente oppure come metterlo nell'albero?
_________________
Visita anche il sito Agriturismo Umbria per maggiori informazioni sull'Umbria!

Realizzazione siti web e applicazioni ASp.NEt, C/C++, C#

Top

Profilo Invia messaggio privato Invia e-mail

garfa
Bravino


Registrato: 09/06/09 15:48
Messaggi: 14

MessaggioInviato: Mer Giu 10, 2009 3:18 pm    Oggetto:

Rispondi citando


se mi aiuti su entrambi mi faresti un gran favore..
per leggere l'input dell'utente ho scritto
Codice:

//==============DATI GLOBALI================

int n; //Per la dimensione della matrice
int *A_p; //Per puntare la matrice

//===============DEFINIZIONI================

void leggi_griglia(int *a,int n) {
int i,j;
 for(i=0;i<n;i++){
  for(j=0;j<n;j++){
scanf("%d",&a[n*i+j]);
  }
 }
return;
}



int main(void)
{
  int i,j;
printf("Dimensione griglia?\n");
scanf("%d",&n);
A_p =(int *) malloc (sizeof(int[n*n]));//Per allocare la memoria per la matrice
leggi_griglia(A_p,n);
return(0);
}


per poterli stampare come faccio? e vedere se salvi i dati i dati in modo giusto...non so se in questo modo posso metterli nell'albero poi!!!

Top

Profilo Invia messaggio privato

cali1981
Site Admin


Registrato: 16/01/06 22:01
Messaggi: 836

MessaggioInviato: Mer Giu 10, 2009 3:23 pm    Oggetto:

Rispondi citando


Per scrivere
Codice:

void scrivi_griglia(int *a,int n) {
int i,j;
 for(i=0;i<n;i++){
  for(j=0;j<n;j++){
printf("%d ",&a[n*i+j]);
  }
 }
return;
}

_________________
Visita anche il sito Agriturismo Umbria per maggiori informazioni sull'Umbria!

Realizzazione siti web e applicazioni ASp.NEt, C/C++, C#

Top

Profilo Invia messaggio privato Invia e-mail

garfa
Bravino


Registrato: 09/06/09 15:48
Messaggi: 14

MessaggioInviato: Mer Giu 10, 2009 3:31 pm    Oggetto:

Rispondi citando


così pero invece di stampare i valori inseriti , stampa dei numeri a 7 cifre che penso siano le locazioni di memoria!!!!!
perchè?! Crying or Very sad

Top

Profilo Invia messaggio privato

cali1981
Site Admin


Registrato: 16/01/06 22:01
Messaggi: 836

MessaggioInviato: Mer Giu 10, 2009 3:33 pm    Oggetto:

Rispondi citando


giusto scusa, togli &
_________________
Visita anche il sito Agriturismo Umbria per maggiori informazioni sull'Umbria!

Realizzazione siti web e applicazioni ASp.NEt, C/C++, C#

Top

Profilo Invia messaggio privato Invia e-mail

garfa
Bravino


Registrato: 09/06/09 15:48
Messaggi: 14

MessaggioInviato: Mer Giu 10, 2009 4:11 pm    Oggetto:

Rispondi citando


ok grazie!! per l'inserimento nell'albero rb hai qualche idea? provo a vedere se riesco a tirare fuori qualcosa!!! dovrò fare qualche funzione che mi crea ogni cella con i valori passati dalla matrice.... Confused

Top

Profilo Invia messaggio privato

Mostra prima i messaggi di:   
Nuovo argomento   Rispondi    Indice del forum -> Programmazione: c#, c++, Java, HTML, PHP, Javascript... Tutti i fusi orari sono GMT
Vai a 1, 2  Successivo
Pagina 1 di 2

 
Vai a:  
Non puoi inserire nuovi argomenti
Non puoi rispondere a nessun argomento
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi votare nei sondaggi
Forum del sito TuttoMontefalco.it - Umbria - Italy topic RSS feed 


Torna al sito TuttoMontefalco.it


Powered by phpBB © 2001, 2005 phpBB Group
phpbb.it

SoftGreen 1.1 phpBB theme by DaTutorials.com
Copyright © DaTutorials 2005