Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Plaud NotePin S, il registratore IA si fa indossabile (ma è facile da perdere)
Plaud NotePin S, il registratore IA si fa indossabile (ma è facile da perdere)
Quattro modi di indossarlo, stessa app del Plaud Note Pro e integrazione con il desktop. Il registratore IA da indossare di Plaud eccelle in mobilità, ma resta vincolato all'abbonamento ed è facile da perdere
Redmi Watch 6 in prova: lo smartwatch con ampio display da 2000 nit a meno di 100 euro
Redmi Watch 6 in prova: lo smartwatch con ampio display da 2000 nit a meno di 100 euro
Xiaomi ha portato Redmi Watch 6 anche sul mercato italiano, puntando su un display AMOLED da 2,07 pollici con picco di luminosità a 2000 nit, frame in alluminio da 9,9mm e un'autonomia dichiarata di 12 giorni. Lo smartwatch gira su HyperOS 3 e integra GPS, Bluetooth 5.4 e oltre 150 sport mode. Il tutto a meno di 100 euro
Mad Catz M.M.O. 7+: lo stesso DNA del R.A.T. 8+ ADV, ma con molti più pulsanti
Mad Catz M.M.O. 7+: lo stesso DNA del R.A.T. 8+ ADV, ma con molti più pulsanti
Con 22 tasti, il pulsante 5D, lo Shift Mode e il sensore PixArt 3395 da 26.000 DPI, il nuovo mouse wireless di Mad Catz si rivolge in modo preciso ai giocatori di MMO e RPG. Ma chi conosce già il R.A.T. 8+ ADV si accorgerà subito di quanto i due prodotti condividano, e di dove invece divergono
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 13-06-2007, 19:05   #1
Mezzetti0903
Senior Member
 
Iscritto dal: Nov 2000
Messaggi: 279
Problemino....battaglia navale

Chi di voi mi può scrivere uno pseudocodice per questo problema?

Scrivere una procedura int navi(char **a, int n) che data una matrice di caratteri di dimensione
n×n contenente soltanto valori 0 e 1 restituisca il numero di sottomatrici contenenti solo il valore 1
massimali (una sottomatrice di 1 `e massimale se non esiste un’altra sottomatrice di 1 che la contiene).
Si assuma che due sottomatrici massimali distinte non siano adiacenti. [Spiegazione: la matrice
rappresenta uno schema di “battaglia navale” e si deve contare quante navi sono presenti; le navi
sono rettangoli di 1 di qualsiasi dimensione e si posso toccare solo in un vertice].
Scrivere poi una procedura int verifica(char **a, int n) che restituisce 0 se e solo se la matrice
viola il vincolo sopra descritto cio`e contiene due sottomatrici di 1 massimali adiacenti.

E' nel testo di un compito della mia ragazza e ci ho pensato un po' e non mi viene nè' un idea banale per risolvere...nè (andando nello scrivere un sacco di codice) un idea corretta ma macchinosa.
Voi che dite?

Grazie!
__________________
In un arco di tempo abbastanza lungo l'indice di sopravvivenza di ognuno scende a zero

Ultima modifica di Mezzetti0903 : 13-06-2007 alle 19:44.
Mezzetti0903 è offline   Rispondi citando il messaggio o parte di esso
Old 14-06-2007, 12:45   #2
Mezzetti0903
Senior Member
 
Iscritto dal: Nov 2000
Messaggi: 279
up...
__________________
In un arco di tempo abbastanza lungo l'indice di sopravvivenza di ognuno scende a zero
Mezzetti0903 è offline   Rispondi citando il messaggio o parte di esso
Old 14-06-2007, 13:01   #3
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Guarda, ammettendo che le navi non possano essere adiacenti in alcun modo (cioè che non si tocchino tra di loro) e che una nave sia composta da almeno 2 celle, dovrebbe essere sufficiente fare una scansione prima in orizzontale e poi in verticale della tabella.
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 14-06-2007, 13:08   #4
Mezzetti0903
Senior Member
 
Iscritto dal: Nov 2000
Messaggi: 279
!

Cioè? cosa intendi?

non so se con la tua idea c'entri qualcosa ma qua le navi possono essere anche 2*3 3*3...e non solo rettangolari di lato uno....(lo dico perchè secondo me l'esempio delle navi è fuorviante)
__________________
In un arco di tempo abbastanza lungo l'indice di sopravvivenza di ognuno scende a zero
Mezzetti0903 è offline   Rispondi citando il messaggio o parte di esso
Old 14-06-2007, 14:51   #5
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da Mezzetti0903 Guarda i messaggi
non so se con la tua idea c'entri qualcosa ma qua le navi possono essere anche 2*3 3*3...e non solo rettangolari di lato uno....(lo dico perchè secondo me l'esempio delle navi è fuorviante)
Io intendevo blocchi di dimensione 1xN o Nx1 (il classico del battaglia navale).

Comunque lasciamo stare le navi ..... parliamo di sottomatrici. A te interessa solo contare il numero di sottomatrici, vero? Se come dici i blocchi possono occupare più righe/colonne, la cosa è un pochino più complessa.

Però mi è venuta in mente adesso una possibile soluzione, che però è "invasiva" per quanto riguarda l'uso della tabella.

Mi spiego meglio: si scansiona tutta la tabella, si fa in pratica il classico doppio ciclo for per righe e colonne. Ogni volta che viene trovato il valore 1 si fa la seguente cosa: si incrementa il contatore delle sottomatrici e poi si azzera la sottomatrice. Cercando nelle varie direzioni altri 1 adiacenti, li si azzera.
Finito l'azzeramento, si continua nella scansione della matrice. Chiaramente avendo tolto la sottomatrice, non salterà più fuori in colonne/righe seguenti.

Se non fosse chiaro, spiego meglio.
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 14-06-2007, 15:27   #6
Mezzetti0903
Senior Member
 
Iscritto dal: Nov 2000
Messaggi: 279
!

Ad una soluzione di questo tipo ci ero arrivato anche io ma non l'avevo postata per lasciare il problema aperto e perchè sostanzialmente è proprio brutta.

Codice:
static int numeroNavi(int x, int y)
        {
            int xInizio=x,xFine=x,yInizio=y,yFine=y;
            /*Finchè cresce
            /*Posso accrescerla in altezza o in lunghezza o tutti e due*/
            /*ACCRESCO IN ALTEZZA*/
            while (yInizio > 0 && matr[x, yInizio-1] == 1)
            {
                yInizio--;
            }
            while(yFine < matr.GetLength(1)-1 && matr[x,yFine+1] == 1){
                yFine++;
            }
            /*Accresco in lunghezza*/
            while (xInizio > 0 && matr[xInizio-1, y] == 1)
            {
                xInizio--;
            }
            while (xFine < matr.GetLength(0) - 1 && matr[xFine+1, y] == 1)
            {
                xFine++;
            }
/*CONTROLLI DA FARE E NON PRESENTI NEL CODICE:*/
            /* Adesso che non posso accrescere tutto quello che è dentro deve essere pieno di uno altrimenti lancio eccezione*/
            /* Tutta la corona esterna della matrice deve essere di 0, tranne nei vertici altrimenti lancio un eccezione*/

            /*Tolgo la sottomatrice trovata*/
            for (int i = xInizio; i <= xFine; i++)
                for (int z = yInizio; z <= yFine; z++)
                    matr[i, z] = 0;

            
            int nx,ny;
            if (trovaUno(out nx, out ny))
                return numeroNavi(nx, ny) + 1;
            else
                return 1;

        }
       static bool trovaUno(out int x, out int y){
           for(int i = 0; i < matr.GetLength(0); i++)
               for(int z = 0; z < matr.GetLength(1); z++)
                   if (matr[i, z] == 1)
                   {
                       x = i;
                       y = z;
                       return true;
                   }
           x = y = 0;
           return false;

       }
i motivi per cui non mi piace sono :
1) è invasiva sulla tabella
2) trovaUno non tiene conto delle matrici già trovate ed azzerate e quindi non è molto efficente.

Volevo trovare una soluzione più carina...almeno per risolvere il problemino 2.

Altre idee?!

Comunque grazie di avermi risposto...degli altri nessuno ha provato.
__________________
In un arco di tempo abbastanza lungo l'indice di sopravvivenza di ognuno scende a zero
Mezzetti0903 è offline   Rispondi citando il messaggio o parte di esso
Old 14-06-2007, 16:08   #7
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Messaggi: 5206
Quote:
Originariamente inviato da Mezzetti0903 Guarda i messaggi
Ad una soluzione di questo tipo ci ero arrivato anche io ma non l'avevo postata per lasciare il problema aperto e perchè sostanzialmente è proprio brutta.
Guarda, ho provato a scrivere del codice, tanto per cimentarmi anche io con questo problema. La tua soluzione che hai postato adesso è praticamente uguale come concetto a quella che avevo detto io.
Salvo il fatto che io per l'azzeramento della sottomatrice ho usato una funzione ricorsiva che richiama sé stessa per spostarsi nelle possibili (max 4) direzioni. Che è poi nient'altro che l'algoritmo del "flood-fill" usato in grafica e che permette di trattare aree anche di forma irregolare.
__________________
Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
Java Versions Cheat Sheet
andbin è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Plaud NotePin S, il registratore IA si fa indossabile (ma è facile da perdere) Plaud NotePin S, il registratore IA si fa indoss...
Redmi Watch 6 in prova: lo smartwatch con ampio display da 2000 nit a meno di 100 euro Redmi Watch 6 in prova: lo smartwatch con ampio ...
Mad Catz M.M.O. 7+: lo stesso DNA del R.A.T. 8+ ADV, ma con molti più pulsanti Mad Catz M.M.O. 7+: lo stesso DNA del R.A.T. 8+ ...
Radeon RX 9070 GRE, AMD la porta in tutto il mondo | Recensione Gigabyte Gaming OC Radeon RX 9070 GRE, AMD la porta in tutto il mon...
Reolink OMVI 3i WiFi: videosorveglianza più intelligente e facile da usare Reolink OMVI 3i WiFi: videosorveglianza pi&ugrav...
Virtua Fighter è tornato e non &e...
Il ritorno di Fumito Ueda, autore di Sha...
Cooler Master svela GPU Shield, la nuova...
Samsung Galaxy S27 Pro: sarà lui ...
Così Google ha ottimizzato Chrome...
Xiaomi non cambia idea: il display poste...
LG presenta in Italia le gamme TV Micro ...
Sette anni dopo l'annuncio, The Wolf Amo...
'Non avrete aumenti': la decisione shock...
TIM lancia il Pass Mondiali DAZN: 104 pa...
Tesla Roadster, promessa o miraggio? La ...
Mark Hamilton, la tavola periodica del m...
Hanger 13 annuncia Uomo d'Onore: espansi...
La battaglia delle HBM4 entra nel vivo: ...
Dopo 12 anni torna Alien: Isolation. Ecc...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 21:28.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v