2013-04-16 9 views
5

Sto progettando un motore per un gioco che ha una matrice 2D come questo:vicini collegati in un array di Java 2D

0,1,1,2,0 
0,1,2,1,1 
1,0,1,0,2 
2,1,2,0,0 
2,0,1,0,0 

Sono bloccato al "game over" condizione in quanto deve controllare se 1 o 2 sono collegati. Dovrebbe dichiarare il giocatore con 1 del vincitore e restituire questo:

1 1 
1 1 1 
1 1 
1 
    1 
    1 

Ho provato con la ricorsione controllando ogni posizione nella matrice e controllando i suoi vicini in tutte le 8 direzioni, ma il metodo sono voluti 45 secondi per l'esecuzione che è inefficiente.

Qualcuno ha qualche idea? Un esempio di pseudo-codice sarebbe apprezzato (io sono uno studente lento).

+3

si può approfondire la condizione? perché p1 è il vincitore? –

+0

Vuoi verificare se tutti gli 1 sono collegati a 8? (O tutti i 2, nel caso del lettore 2?) –

+1

puoi pubblicare ciò che hai provato? –

risposta

0

andare avanti e fare un grafico duplicato a[n][n] con a[i][j] = 1 se i e j sono collegati.

Quindi è possibile effettuare le seguenti operazioni:

int count = 0; 

void dfs(int i) 
{ 
    int k; 
    for(k = 0; k < n; k++) 
    { 
     if(A[i][k] == 1 && !visited[k]) 
     { 
      count++; 
      visited[k] = 1; 
      dfs(k); 
     } 
    } 
} 

for(i=0; i < n;i++) 
{ 
    if(!visited[i]) 
    { 
     count=1; 
     visited[i]=1; 
     dfs(i); 
     // map i with count .. here 
    } 
} 

Quindi, una volta che avete fatto la mappatura numero di nodi in una rete con uno dei suoi nodi.

Troverete conteggio valore e se count == di total_no_of_1

Se è così allora Rete 1 è collegato .if non poi lo stesso con 2 e di conseguenza e dichiarano.

+0

grazie per questo mi hai davvero salvato un sacco di ore il mio codice era qualcosa di simile in ricorsione ma si è scoperto che ho contato gli stessi nodi all'infinito quindi grazie ancora –

+1

Benvenuto .......! – MissingNumber

1

ecco alcuni suggerimenti:

  • Se possibile, tenere traccia di quante 1 e 2 di ci sono fin dall'inizio.
  • Quando si verifica se sono connessi, è possibile utilizzare una matrice boolean e un contatore, per tenere traccia di quelli già controllati e quanti di essi.
  • Utilizzare la ricorsione sui vicini necessari invece di controllare ogni posizione nella matrice.
0

Questa domanda non è così semplice. Mi sembra che tu possa guardare la tua matrice come un grafico e tu cerchi di scoprire se il tuo grafico è connesso. cioè il grafico di 1s connesso ed è il grafico di 2s connesso. Qui vedi un few algorithms. Dato che stai creando il grafico puoi anche tenere traccia dei gruppi di nodi creati da un giocatore e creando un nuovo nodo, puoi verificare quanti gruppi sono connessi al nuovo nodo e unione qualunque sia connesso dal nuovo nodo (o crea un nuovo gruppo contenente il tuo nuovo nodo se non connette nulla).

btw è possibile convertire qualsiasi ricorsione in un ciclo, ma ciò dovrebbe essere necessario solo se lo stack si esaurisce.

0

Mantenere una struttura dati UnionFind dall'inizio, ogni voce rappresenta ciascuna cella. Inizialmente, eseguire un'unione su celle adiacenti con gli stessi valori. Quando un giocatore segna una cella, esegui un'unione() con le celle adiacenti se il valore è uguale al valore del giocatore. Nel Trova Unione, puoi tenere traccia del numero di celle che hanno un valore, quando quel numero è uguale al numero di volte che quel valore è stato inserito, hai un vincitore.

È anche farlo linearmente utilizzando l'algoritmo descritto here