[C] Problema Homework

dan952
Il professore di informatica generale ogni 2 settimane ci rovina il weekend dandoci una scheda con 3 programmi da fare, siamo arrivati alla 3° scheda ma ho un problema con il secondo esercizio[nota]Anche il 3° non so fare ma di certo non me lo potete fare voi per regolamento.[/nota] , il problema sta nel fatto che non viene la matrice a sinistra come dice lui. O sbaglio?

Risposte
kobeilprofeta
che matrice ti risulta?

vict85
L'algoritmo è una versione modificata della moltiplicazione matriciale in cui invece di scrivere C[j] += A[k] * A[k][j]; usi C[j] |= (A[k] & A[k][j]).

L'ho provato e usando la matrice a a destra mi viene corretto. Leggi bene il testo.

Per il terzo punto hai qualche idea?

dan952
Ciao Kobe e vict,
Metto il mio codice del secondo:
for(i = 0; i < n; i++){
         for(j = 0; j < n; j++){
            cont=0;
            for (k=0;k<n;k++){
                if (b[i][k]==1 && b[k][j]==1){
                    a[i][j]=1;
                    cont=1;
                    
               }
           
           }
           if (cont==0){
                a[i][j]=0;
           }
         }
    }


Per il 3 non ho idea, ancora.

dan952
@vict
Ho riprovato con il suggerimento ma non fa lo stesso. Sei sicuro che inserendo input quella di destra ti venga quella di sinistra?

vict85
Ho scritto questo codice
#include <stdio.h>

#define N 4

// Fa la moltiplicazione/composizione di due relazioni A e B e salva il risultato in Res
void compose(int const A[N][N], int const B[N][N], int Res[N][N])
{
    for(int i = 0; i != N; ++i)
        for(int j = 0; j != N; ++j)
            Res[i][j] = 0; // inizializzo la matrice dei risultati
    
    for(int i = 0; i != N; ++i)
    {
        for(int k = 0; k != N; ++k)
        {
            int const t1 = A[i][k];
            for(int j = 0; j != N; ++j)
            {
                Res[i][j] |= (t1 & B[k][j]);
            }
        }
    }
}

int main(int argc, const char * argv[])
{
    //int R1[N][N] = { {1, 1, 1, 1}, {1, 1, 1, 1}, {0, 0, 0, 0}, {0, 0, 1, 0} };
    int R1[N][N] = { {0, 1, 0, 0}, {1, 0, 1, 1}, {0, 0, 0, 0}, {0, 0, 1, 0} };
    int R[N][N] = { 0 };
    
    compose(R1, R1, R);
    for(int i = 0; i != N; ++i)
    {
        for(int j = 0; j != N; ++j)
        {
            printf("%d ", R[i][j]);
        }
        puts("");
    }
}
e come output mi dà quello segnato, ovvero \(\displaystyle \begin{pmatrix} 1 & 0 & 1 & 1 \\ 0 & 1 & 1 & 0 \\ 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 \end{pmatrix} \).

Per quello successivo, il mio approccio sarebbe quello di usare il fatto che:
\(\displaystyle D_{i,j} = \min_k [kR^k]_{i,j} \) dove \(\displaystyle R \) è la relazione in cui però al posto di 0 si mette infinito.

dan952
Non riesco a leggere la matrice dal cellulare, dunque l'input è:
$( ( 0 , 1 , 0 , 0),( 1 , 0 , 1 , 1),( 0 , 0 , 0 , 0 ),( 0 , 0 , 1 , 0 ) )$
l'output secondo il prof sarebbe:
$( ( 1 , 1 , 1 , 1),( 1 , 1 , 1 , 1),( 0 , 0 , 0 , 0 ),( 0 , 0 , 1 , 0 ) )$
Ma non è così perché $R[3][2]=1$, ma nella seconda riga sono tutti zeri, cioè $R[2][x]=0$ con $x=0,1,2,3$.

vict85
Rileggi il pdf, non c'è scritto quello. Comunque il tuo codice mi sembra corretto.

dan952
C'è scritto: presa in input la matrice di destra l'output è la matrice di sinistra. Eh...come devo interpretarlo scusa?

kobeilprofeta
a sinistra sotto l'ultima frase

kobeilprofeta

Esempio: Ricevendo in input le matrice di destra nell’esempio dell’Esercizio 1,
l’output deve essere:
1 0 1 1
0 1 1 0
0 0 0 0
0 0 0 0


dove leggi "sinistra"?
mi sa che non ho capito cosa intendi

dan952
Sul PDF c'è scritto:

Esempio: Ricevendo in input la matrice di destra nell’esempio dell’Esercizio 1, l’output deve essere la matrice di sinistra.

vict85
Io leggo come Kobe. Forse la tua è una versione vecchia del file in cui il professore ha fatto un errore, e ora ha aggiornato il file sul sito correggendolo.

dan952
Si infatti ho scaricato di nuovo il file, come pensavo si era sbagliato lui.

kobeilprofeta
Infatti la prima volta che ho aperto il pdf mi sembrava di aver letto la frase di Dan. Solo che avevo dato per scontato che la matrice era quella (la terza) e non la prima

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.