Dubbio esercizio

di il
1 risposte

Dubbio esercizio

Ciao a tutti, sono nuovo del forum. Avrei un dubbio su un esercizio, spero possiate aiutarmi.
--------

Implementare la funzione C:

int insert_word(char* word, char** m, int m_rows, int m_cols,int row, int col, int direction);
che data in input una stringa word che rappresenta una parola, e una matrice m rappresentante un cruciverba di dimensioni m_rows e m_cols, inserisca la parola word nella matrice m a partire dalla posizione [row, col]. Se la variabile di input direction ha valore 0 la parola deve essere inserita orizzontalmente, altrimenti verticalmente. Nel cruciverba le caselle nere sono identificate dal carattere '#', le caselle vuote dal carattere '_', le caselle possono anche contenere una qualsiasi lettera fra la 'a' e la 'z'. Per poter inserire la parola nella posizione e direzione richiesta, non devono esserci caselle nere e se ci sono lettere esse devono coincidere con quelle della parola stessa. Inoltre la parola deve terminare esattamente in corrsipondenza di una casella nera oppure sul bordo. La funzione deve ritornare 0 se la parola non può essere inserita, 1 altrimenti.

--------

Qui il mio codice:
#include <stdlib.h>
#include <string.h>

#include "esercizio1.h"

int insert_word(char* word, char** m, int m_rows, int m_cols, 
		int row, int col, int direction) {
	int s=strlen(word);                                       
	int i=row;
	int j=col;
	int l=0;
	int n=0;
	if (direction==1) {                                    
		if (i+s<m_rows) {
                        n=-1;
			for (i; i<i+s; i++) {
                                n++;
				if(m[i][j]=='#' || m[i][j]!=*(word+n))
                                return 0;
			}
			i=row;
                        n=0;
			for (i; i<i+s; i++) {
					m[i][j]=*(word+n);
					n++;
			}
		return 1;
		}
	}
	if (direction==0) {
		if (j+s<m_cols) {
                        l=-1:
			for (j; j<j+s; j++) {
                                l++;
				if(m[i][j]=='#' || m[i][j]!=*(word+l);)
					return 0;
			}
			j=col;
                        l=0;
			for (j; j<j+s; j++) {
				m[i][j]=*(word+l);
					l++;
				}
			}
		return 1;
		}
}

Non capisco perchè non funzioni.
In s memorizzo la lunghezza della stringa, poi controllo che la parola vada immessa verticolamente o orizzontalmente con if (direction==1/0), controllo che la parola non
sia troppo lungha con if (i/j+s<m_rows/m_cols), scorro poi gli elementi della matrice
per vedere se c'è un "#, oppure un elemento che non combacia anche per posizione con una lettera della parola, nel caso ritorno 0. Se ciò non avviene resetto il valore di i/j
, in cui avevo salvato la riga/colonna di partenza e scorro la matrice facendo l'assegnazione.
Il problema è che non riesco a fare proprio l'assegnazione, le caselle vuote rimangono vuote e non capisco il motivo.


Spero possiate aiutarmi, grazie in anticipo.

1 Risposte

  • Re: Dubbio esercizio

    Ho letto velocemente il codice e non mi tornano un po' di cose.
    Comunque dovrebbe ritornarti sempre 0, tranne quando la parola non è inseribile e già completamente inserita. Perché quando fai il confronto:
    if(m[i][j]=='#' || m[i][j]!=*(word+n))
                    return 0;
    m[j] varrà o la lettera corrispondente quindi uguale a *(word+n); oppure il carattere _ quindi è diverso da *(word+n) ma che è possibile inserire visto che quel carattere corrisponde a una cella accessibile.
Devi accedere o registrarti per scrivere nel forum
1 risposte