[C] Problema Homework
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
che matrice ti risulta?
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?
L'ho provato e usando la matrice a a destra mi viene corretto. Leggi bene il testo.
Per il terzo punto hai qualche idea?
Ciao Kobe e vict,
Metto il mio codice del secondo:
Per il 3 non ho idea, ancora.
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.
@vict
Ho riprovato con il suggerimento ma non fa lo stesso. Sei sicuro che inserendo input quella di destra ti venga quella di sinistra?
Ho riprovato con il suggerimento ma non fa lo stesso. Sei sicuro che inserendo input quella di destra ti venga quella di sinistra?
Ho scritto questo codice
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.
#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.
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$.
$( ( 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$.
Rileggi il pdf, non c'è scritto quello. Comunque il tuo codice mi sembra corretto.
C'è scritto: presa in input la matrice di destra l'output è la matrice di sinistra. Eh...come devo interpretarlo scusa?
a sinistra sotto l'ultima frase
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
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.
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.
Si infatti ho scaricato di nuovo il file, come pensavo si era sbagliato lui.
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