2010-12-09 18 views
0

int duplicate (int cards[5][4][13])Funktion zu finden duplizieren (2d) Zellen in einem 3D-Array

Ich habe eine Funktion zu entwickeln versucht (der Prototyp oben ist), die durch eine 3D-Array-Schleifen, die 5 Karten einer Hand hält und die numerischen Index zu einer Zelle, die eine 1 enthält, die anzeigt, dass eine Karte existiert, basiert auf der Farbe (4) und dem Gesicht (13).

Zum Beispiel, wenn in einer hypothetischen Hand die erste Karte eine Sieben von Vereinen wäre, wäre ihr Index: [1] [3] [7] wobei 1 die Karte 3 = Vereine und 7 = Sieben ist.

Ich muss alle fünf Karten in der Hand durchlaufen und herausfinden, ob es zwei identische Karten gibt.

Ich kann nicht herausfinden, wie man das macht, weil ich den Index der ersten Karte mit den anderen vier vergleichen konnte, aber dann würden die restlichen Karten nicht miteinander verglichen werden.

Die Funktion gibt 1 zurück, wenn ein Duplikat vorhanden ist, oder 0, wenn nicht.

Ich bin sehr verwirrt.

Danke!

Antwort

1

Eine Möglichkeit, dies zu nähern, ist eine Schleife über alle möglichen Karte und zählen, wie oft es erscheint:

int suit; 

for (suit = 0; suit < 4; suit++) { 
    int rank; 

    for (rank = 0; rank < 13; rank++) { 
     int count = 0; 
     int card; 

     for (card = 0; card < 5; card++) { 
      count += cards[card][suit][rank]; 
     } 

     if (count > 1) 
      return 1; 
    } 
} 

return 0; 

jedoch die Datenstruktur, die Sie gewählt haben, ist nicht sehr effizient. Um herauszufinden, welche Karte N ist, müssen Sie durch alle cards[N][0..3][0..12] suchen die 1. Ein besserer Ansatz zu finden wäre zu verwenden ein struct:

struct card { 
    int suit; /* 0..3 */ 
    int rank; /* 0..12 */ 
}; 

struct card cards[5]; 

Das wird viel einfacher, mit zu arbeiten. Zum Beispiel, um Duplikate zu finden, würden Sie brauchen nur zu prüfen, ob eine der anderen Karten die gleichen rank und suit Werte hatten:

int card1, card2; 

for (card1 = 0; card1 < 5; card1++) 
    for (card2 = card1 + 1, card2 < 5; card2++) 
     if (cards[card1].suit == cards[card2].suit && cards[card1].rank == cards[card2].rank) 
      return 1; 
return 0; 
+0

Hier ist ein Beispiel für mein Denken: card1: Karten [1] [3] [7], card3: Karten [3] [3] [7]. Sie sind verschiedene Karten, aber sie sind identisch. – Jerry

+0

Sie möchten also herausfinden, ob es eine identische Karte in einer * anderen * Hand gibt? – caf

+0

In der Hand. Karten könnten in diesem Fall besser als Hände bezeichnet werden. von der 5 karte in dieser hand suche ich nach zwei identischen. – Jerry

1

Sie scheinen eine Hand zu beschreiben, die eine Sammlung von 5 (hoffentlich einzigartige) Karten. das heißt, du willst 5 Objekte. Aber cards[5][4][13] ist 260 Objekte. Das wäre für eine Struktur mit 5 Steckplätzen, und jeder Steckplatz kann irgendeine Menge irgendeiner Art von Karte enthalten.

Da ich vermute, dass das ist, was Sie wirklich wollen, rate ich Ihnen, Ihre Darstellung einer Hand auf int cards[5] zu ändern. In jeder Position in cards werden Sie eine ganze Zahl von 0-12 für jede Karte in der Farbe der Herzen, 13-25 für jede Karte in der Pik-Karte, und so weiter für Vereine und Diamanten setzen. Wenn Sie auch eine Möglichkeit benötigen, um keine Karte in diesem Slot darzustellen, können Sie -1 verwenden.

Die Überprüfung auf Duplikate ist einfach, vergleichen Sie einfach jeden Integer-Wert in der Hand.

Verwandte Themen