Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 32

Discussione: Problema backtracking

  1. #1

    Problema backtracking

    Salve a tutti, all'università ci hanno dato questo compito che dovremo risolvere, a quanto ho capito
    potrei risolverlo con il backtracking. ho cercato un po di informazione su internet per vedere il funzionamento pero non so come applicarlo al problema che ci hanno dato, quindi vi chiedo un consiglio per cominciare, ho fatto la lettura da input della matrice e gli altri dati ma non so come applicare backtracking.

    il compito lo dovrei svolgere in java

    grazie

    Sia M una matrice di dimensione n*m con n, m > 0 rappresentante il territorio da controllare.
 Ogni cella di M può contenere uno dei caratteri dell’insieme { *, - }: il carattere * indica una zona d’interesse che deve essere controllata, mentre il carattere - indica uno spazio vuoto.

    È possibile costruire una torre di sorveglianza nelle zone d’interesse.

    Se si costruisce una torre in una zona d’interesse (i, j) allora:
    - la zona d’interesse (i, j) è controllata, e
    - una zona d’interesse tra (i, j+1), (i, j-1), (i+1, j) e (i-1, j) è controllata a sua volta, secondo l’orientamento della torre.
    Non c’è un limite sul numero di torri da costruire ma l’Imperatore ha espressamente chiesto di costruirne il minore numero possibile.
    Implementare un programma che restituisca il numero minimo di torri da costruire sul territorio in modo da controllare tutte le zone d’interesse.
    Input
    La lettura dovrà avvenire da standard input.
    L’input consiste in un numero i (i ≥ 1) di test, rappresentanti i territori da controllare; per ogni territorio, il formato è il seguente:
    - la prima riga contiene la parola chiave territory e un numero j (separati da spazio),
    rappresentate l’inizio del j-esimo territorio;
    - la seconda riga contiene i numeri n m, dove n è il numero di righe della matrice e m il
    numero di colonne della matrice;

    - le successive n righe sono nel formato c1 c2 ... cm, ovvero un numero m di caratteri separati
    da uno spazio; ogni riga con questo formato rappresenta una riga della matrice.
    Questo formato vale per tutti i test. L’input termina con la stringa -1.
    Si assumi che l’input sia corretto e che non ci siano caratteri diversi da * o - nella matrice.
    Output
    L’output del programma deve avvenire su standard output; per ogni test, l’output deve essere nel seguente formato:
    - la prima riga contiene la parola chiave result e un numero k (separati da uno spazio),
    rappresentanti il k-esimo test;
    - la seconda riga contiene un numero a rappresentante il numero minimo di torri da costruire
    per controllare tutte le zone d’interesse.
    Esempio input
    territory 1
    3 2
    * *
    - *
    * -
    territory 2 4 4
    **** *--- **-* -*-* territory 3 37 *-*---* **-**-- *--**-* -1
    Esempio output
    result 1
    3
    result 2
    5
    result 3 8


    io ho provato ad scrivere questo ma mi sa che sono lontano dalla sol.

    mi manca di implementare il candd

    package x;


    import java.awt.Point;
    import java.io.BufferedReader;
    import java.io.Console;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.nio.Buffer;
    import java.util.ArrayList;


    public class Matrice {
    String matrix[][];
    int riga, colonna;
    int cont;


    public Matrice(int riga, int colonna) {
    this.colonna = colonna;
    this.riga = riga;
    cont = 0;
    matrix = new String[riga][colonna];
    }


    public void input(BufferedReader input) throws IOException {
    String array[] = new String[colonna];
    for (int i = 0; i < riga; i++) {
    String x = input.readLine();
    array = x.split(" ");
    for (int j = 0; j < colonna; j++) {
    matrix[i][j] = array[j];
    }
    }


    }


    ArrayList<Point> punti = new ArrayList<Point>();


    int p = 0;
    private int soluzionePeggiore;


    public boolean risolved(ArrayList<Point> punt) {
    while (p < punt.size()) {
    int i = (int) punt.get(p).getX();
    int j = (int) punt.get(p).getY();
    if (canAdd(i, j, punt)) {
    aggiungiSol(i, j, punt);
    if (isComplete(punti)) {
    return true;
    } else if (risolved(punt)) {
    return true;
    }
    remove(i, j, punt);
    p++;
    } else {
    p++;
    }
    }
    return false;


    }


    private void remove(int i, int j, ArrayList<Point> punt) {
    for (int x = 0; x < punt.size(); x++) {
    if (punt.get(x).getX() == i && punt.get(x).getY() == j)
    punt.remove(x);
    }


    }


    private boolean isComplete(ArrayList<Point> punti2) {


    return (p <soluzionePeggiore);
    }


    private void aggiungiSol(int i, int j, ArrayList<Point> punt) {


    punt.add(new Point(i, j));
    }


    private boolean canAdd(int i, int j, ArrayList<Point> punt) {

    return true;
    }


    public int numeroTorri() {
    for (int i = 0; i < riga; i++) {
    for (int j = 0; j < colonna; j++) {
    if (matrix[i][j].equals("*")) {
    punti.add(new Point(i, j));
    }


    }
    }
    soluzionePeggiore = punti.size();
    risolved(punti);
    return punti.size();


    }


    public void stampa() {
    System.out.println();
    for (int i = 0; i < riga; i++) {
    for (int j = 0; j < colonna; j++) {
    System.out.print(matrix[i][j]);
    }
    System.out.println();
    }
    }
    }

  2. #2
    Il codice va dentro i tag
    [code]
    your code here
    [/code]
    altrimenti non si capisce nulla.


    Fammi capire bene:
    Una zona di interesse può contenere una torre è vero? (questo quanto si evince dal testo)

    La zona controllata sarà (al tempo stesso) la stessa cella e i suoi 4 vicini?

    Ciao.
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  3. #3
    Quote Originariamente inviata da schumy2000 Visualizza il messaggio
    Il codice va dentro i tag
    codice:
    your code here
    altrimenti non si capisce nulla.


    Fammi capire bene:
    Una zona di interesse può contenere una torre è vero? (questo quanto si evince dal testo)

    La zona controllata sarà (al tempo stesso) la stessa cella e i suoi 4 vicini?

    Ciao.

    La zona di interesse può contenere una torre e quindi essere controlla ed UNA sola cella adiecente (N,S,O,E)

  4. #4
    nel esempio :
    territory 1
    3 2
    * *
    - *
    * -

    il primo asterisco è una zona di interesse siccome ha un'altro adiacente lo considero solo una volta, quello della seconda riga (1,2) lo considero singolo dato che al suo Nord ho un altro asterisco ma sta già essendo controllato dall * (1,1), per ultimo abbiamo l'* (1,3) che è singolo , quindi l'output sarà 3

  5. #5
    Guarda nella matrice 4 4 e ottengo come dici tu una configurazione di 5 torri

    * * * * 2
    * - - - 1
    * * - * 2
    - * - * 0


    Mi costruisco una matrice di oggetti Field (o come vuoi chiamarlo)
    e questo oggetto Field avrà degli attributi
    boolean zonainteresse;
    boolean sonotorre;
    boolean sonogiacontrollato;


    Parto dalla prima casella ed ogni volta mi devo fare queste domande per se stesso:
    ripropongo lo schema:

    * * * * 2
    * - - - 1
    * * - * 2
    - * - * 0

    partendo dalla prima casella

    sono zona di interesse? si
    sono già controllato? no

    se abbiamo questa configurazione possiamo mettere una torre e vedere se nei suoi quattro vicini c'è una zona di interesse da controllare, che non sia già controllata o già torre, se c'è setti il valore di già controllato a true del suo vicino

    Passiamo alla seconda casella:
    sono zona di interesse? si
    sono già controllato? si

    quindi possiamo passare alla terza....

    Così mi risulta che:
    nella terza impianto una torre
    la quarta è già controllata
    la quinta devo impiantare una torre con la quale controllo la nona cella
    la decima metto una torre con la quale controllo la quatttordicesima cella
    e stesso discorso per tra la dodicesima e la sedicesima cella

    Con questo metodo ottengo 5 torri da impiantare nello schema.

    Fammi sapere se hai qualche domanda.

    Ciao.
    Ultima modifica di schumy2000; 09-09-2015 a 11:33
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  6. #6
    P.S.
    Con la tua matrice 7x3, col mio algoritmo avrei 8 torri da impiantare

    *-*---* 3
    **-**-- 2
    *--**-*- 3

    In quanto (T= Torre , C= Controllato)

    T - T - - - T 3
    C T - T C - - 2
    T - - T C T - 3


    Ciao.
    Ultima modifica di schumy2000; 09-09-2015 a 11:49
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  7. #7
    Quote Originariamente inviata da schumy2000 Visualizza il messaggio
    Guarda nella matrice 4 4 e ottengo come dici tu una configurazione di 5 torri

    * * * * 2
    * - - - 1
    * * - * 2
    - * - * 0


    Mi costruisco una matrice di oggetti Field (o come vuoi chiamarlo)
    e questo oggetto Field avrà degli attributi
    boolean zonainteresse;
    boolean sonotorre;
    boolean sonogiacontrollato;


    Parto dalla prima casella ed ogni volta mi devo fare queste domande per se stesso:
    ripropongo lo schema:

    * * * * 2
    * - - - 1
    * * - * 2
    - * - * 0

    partendo dalla prima casella

    sono zona di interesse? si
    sono già controllato? no

    se abbiamo questa configurazione possiamo mettere una torre e vedere se nei suoi quattro vicini c'è una zona di interesse da controllare, che non sia già controllata o già torre, se c'è setti il valore di già controllato a true del suo vicino

    Passiamo alla seconda casella:
    sono zona di interesse? si
    sono già controllato? si

    quindi possiamo passare alla terza....

    Così mi risulta che:
    nella terza impianto una torre
    la quarta è già controllata
    la quinta devo impiantare una torre con la quale controllo la nona cella
    la decima metto una torre con la quale controllo la quatttordicesima cella
    e stesso discorso per tra la dodicesima e la sedicesima cella

    Con questo metodo ottengo 5 torri da impiantare nello schema.

    Fammi sapere se hai qualche domanda.

    Ciao.

    grazie per la tua risposta, teoricamente ho capito il concetto ma un altra cosa è scrive il codice in JAVA, ad esempio non mi è chiaro come fare la funzione canADD o la ricorsione in questo caso

  8. #8
    Quote Originariamente inviata da marcos666 Visualizza il messaggio
    grazie per la tua risposta, teoricamente ho capito il concetto ma un altra cosa è scrive il codice in JAVA, ad esempio non mi è chiaro come fare la funzione canADD o la ricorsione in questo caso

    vedi per favore se sto facendo bene secondo le tue indicazioni:

    codice:
    public void control(String matrix2[][],boolean zonainteresse, boolean sonotorre, boolean sonogiacontrollato)
    	{
    		int cont=0;
    		for(int i=0; i<riga; i++)
    		{
    			for(int j=0; j<colonna; j++)
    			{
    				if(matrix2[i][j].equals("*"))
    				{
    					zonainteresse=true;
    					sonogiacontrollato=false;
    					if(j+1 < colonna || i+1 < riga || (j-1<0) || !(i-1<0))
    					{
    						if(matrix2[i][j+1].equals("*") || matrix2[i+1][j].equals("*") || matrix2[i-1][j].equals("*") || matrix2[i][j-1].equals("*"))
    						{
    							if(!sonotorre && !sonogiacontrollato)
    							{
    								cont++;
    							}
    						}
    					}
    					
    					
    				}
    			}
    		}
    	}

  9. #9
    Allora in primis io non farei ricorsione, poi se è richiesto dalla consegna è un altro discorso.

    Tre classi
    Field
    Matrix
    Main e metodo main

    La classe Field ti ho già detto come modellarla.

    Classe Matrix
    codice:
    public class Matrix {
      private Field[][] campo;
      private int counter;
      private Matrix (int m, int n){ 
          inizializzi la matrice e gli oggetti contenuti
           counter=0;
      }
    
    
      public void createMyField(){
      //inizializzi con punti di interesse randomici
        
      }
    
      public int scanAndPutTower(){
         for (int i=0; i<n; i++){
           for (int j=0; j<n; j++){
             if (campo[i][j].isInteresting() && !(campo[i][j].isAlreadyChecked())){
               campo[i][j].setTower(true);
               counter++;
               //poi controllo i vicini stando attento ai bordi 
               //per semplicità ed per fretta evito questa parte tu ovviamente lo terrai in conto
             
               if(isCheckedField(campo[i][j+1]) break;
               if(isCheckedField(campo[i+1][j]) break;
               if(isCheckedField(campo[i-1][j]) break;
               if(isCheckedField(campo[i][j-1]) break; //quest'ultima si potrebbe anche evitare visto che è il tuo verso di lettura
             }
           }
         }
         return counter;
      }
       
      private boolean isCheckedField(int k, int w){
         if(campo[k][w].isInteresting() && !(campo[k][w].isTower()) && !(campo[k][w].isAlreadyChecked())){
           campo[k][w].setAlreadyChecked(true);
           return true;
         }
         return false;
      }
    }
    Main -- che potresti metterlo anche sotto Matrix
    codice:
    public class Main {
      public static void main(String[] args){
        Matrix matrix=new Matrix(4,4);
        matrix.createMyField();
        int towers=matrix.scanAndPutTower();
        System.out.println("Torri: "+towers);
     }

    Ho scritto di getto questo codice nei momenti di pausa del lavoro sicuramente è da affinare.

    Per il resto son qua.

    Ciao
    Ultima modifica di schumy2000; 09-09-2015 a 14:38
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  10. #10
    Eviterei di usare stelline o caratteri vari..usa varibili booleane e segui quello che ho fatto...
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.