2017-06-17 3 views
-1

Es gibt eine Wand aus Zahlen gebaut. 0 bedeutet, dass es ein Loch gibt und Blöcke nicht auf Löchern sitzen können. Jemand hat eine Spezialwaffe, die alle Blöcke mit einer Nummer in einem Schuss abfeuert.
Also habe ich eine Matrix namens Wand und muss eine Pistole schreiben. Ich habe das Programm geschrieben, aber ich habe ein Problem und ich verstehe nicht, warum es passiert. In meinem CodeWand zerstören

#include <iostream> 
#include <cstdio> 

using namespace std; 

int createWall(int &height, int &length, int wall[][ 100 ], int shots) 
{ 
    int i; 
    int j; 
    cin >> height; 
    cin >> length; 
    cin >> shots; 
    for (i = 0; i < height; i++) 
    { 
     for (j = 0; j < length; j++) 
     { 
      cin >> wall[ i ][ j ]; 
     } 
    } 
    return shots; 
} 


void wallNow(int height, int length, int wall[][ 100 ]) 
{ 
    int i; 
    int j; 
    for (i = 0; i < height; i++) 
    { 
     for (j = 0; j < length; j++) 
     { 
      cout << wall[ i ][ j ] << " "; 
     } 
     cout << "\n"; 
    } 
} 

void destroyWall(int height, int length, int wall[][100], int shots) 
{ 
    int i; 
    int j; 
    int k; 
    int x; 
    int aimedBlocks;//number to be "destroyed" 
    //set all aimedBlocks to 0 
    for (x = 0; x < shots; x++) 
    { 
     cin >> aimedBlocks; 
     for (i = 0; i < height; i++) 
     { 
      for (k = 0; k < length; k++) 
      { 
       if (wall[ i ][ k ] == aimedBlocks) 
       { 
        wall[ i ][ k ] = 0; 
       } 
      } 
     } 
    } 

    int counter;//I use this variable because at some point I have a 0 followed only by 0's 
    for (i = 0; i < length; i++) 
    { 
     j = height - 1; 
     counter = 0; 
     //if I find a 0 then I move all elements higher that it one step down 
     while (counter < height) 
     { 
      if (wall[ j ][ i ] == 0) 
      { 
       for (k = j; k > 0; k--) 
       { 
        wall[ k ][ i ] = wall[ k - 1 ][ i ]; 
       } 
       wall[ height - j - 1 ][ i ] = 0; 
      } 
      else 
       j--;//I don't always go up ene step because the "block" droped in place of 0 may be 0 
      counter++; 
     } 
    } 
} 

int main() 
{ 
    int height; 
    int length; 
    int wall[ 100 ][ 100 ]; 
    int shots = 0; 
    shots = createWall(height, length, wall, shots); 
    destroyWall(height, length, wall, shots); 
    wallNow(height, length, wall); 
} 

Ich verstehe wirklich nicht, warum Linie wall[ height - j - 1 ][ i ] = 0; wird für die ersten 4 Spalten im folgende Beispiel arbeiten und es für die letzten nicht funktioniert.

Format Eingang:

height length shots 
wall_0_0 ... wall_0_length 
... ... ... 
wall_height ... wall_height_length 
shot_0 ... shot_shots 

Eingang:

4 5 3 
3 5 4 5 1 
2 1 1 5 3 
1 1 5 5 1 
5 5 1 4 3 
1 5 1 

Entfernen Sie alle Werte, die mit 1 übereinstimmt, 5, 1. Und Mauerreste müssen in den Boden fallen.

Ausgang:

0 0 0 0 0 
0 0 0 0 0 
3 0 0 0 0 
2 0 4 4 3 

Erwartet:

0 0 0 0 0 
0 0 0 0 0 
3 0 0 0 3 
2 0 4 4 3 

Bitte helfen Sie mir dieses Problem zu lösen. Ich konnte es nicht finden, den Code zu debuggen.

+1

Es klingt wie Sie einen Debugger verwenden müssen. –

+0

@JamesRoot Ich habe den Debugger –

Antwort

2

Ihr Algorithmus ist seltsam, ich verstehe nicht, was Sie zu tun versuchen.

Ein einfacher Weg, um Ihr Ziel zu erreichen, ist von links nach rechts von der Wand zu durchlaufen, dann für jeden Sie von unten nach oben durchlaufen. Jedes Mal, wenn Sie eine 0 erhalten, suchen Sie nach einem Wert ungleich Null an der Spitze und tauschen sie aus, wenn Sie sie gefunden haben.

Beispiel (sehr einfach könnte verbessern):

for (size_t i = 0; i < length; i++) { // i is for iterate from left(0) to right(length - 1) 
    size_t j = height; // j is for iterate from bot(height - 1) to top(0) 
    while (j-- > 0) { 
    if (wall[j][i] == 0) { 
     size_t k = j; // k is for found a non zero value from j - 1 to the top(0) 
     while (k-- > 0) { 
     if (wall[k][i] != 0) { 
      wall[j][i] = wall[k][i]; 
      wall[k][i] = 0; 
      break; 
     } 
     } 
    } 
    } 
} 

Hinweis:

  1. ich size_t verwenden, da dies die Art für den Index ist.
  2. Ich empfehle Ihnen für std::vector wechseln und Iterator auf sie in C++ verwenden.
+0

Ich lerne das ist, warum ich seltsame Algorithmen schreibe. Vielen Dank! Und warum ist 'size_t' der Typ für index? –

+0

@ Timʘtei http://en.cppreference.com/w/cpp/types/size_t. Denken Sie daran, dass dieser Typ nicht signiert ist. Kann für einen Anfänger seltsam zu manipulieren sein. Aber du solltest lernen, wie man es benutzt. https://StackOverflow.com/a/22587575/7076153 – Stargateur

+0

Was ich von der 2. Verbindung verstanden habe, ist nicht in Loops vorzeichenlos zu verwenden. –