Есть стена, построенная из чисел. 0
означает, что есть дыра, и блоки не могут сидеть на дырах. У кого-то есть специальный пистолет, который стреляет всеми блоками с числом за один выстрел.
Итак, у меня есть матрица, называемая стеной, и мне нужно написать пистолет. Я написал программу, но у меня проблема, и я не понимаю, почему это происходит. В моем коде
#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 );
}
Я действительно не понимаю, почему строка wall[ height - j - 1 ][ i ] = 0;
работает для первых 4 столбцов в следующем примере и не работает для последнего.
Формат ввода:
height length shots
wall_0_0 ... wall_0_length
... ... ...
wall_height ... wall_height_length
shot_0 ... shot_shots
Вход:
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
Удалите все значения, соответствующие 1
, 5
, 1
. А остатки стен должны упасть на дно.
Выход:
0 0 0 0 0
0 0 0 0 0
3 0 0 0 0
2 0 4 4 3
Ожидал:
0 0 0 0 0
0 0 0 0 0
3 0 0 0 3
2 0 4 4 3
Пожалуйста, помогите мне решить эту проблему. Я не мог найти его для отладки кода.
size_t
тип для индекса? 17.06.2017size_t
, потому что некоторые люди не согласятся. Кстати, как и в случае с C++, эта проблема должна исчезнуть, потому что вы должны использоватьstd::vector
иiterator
, которые скроют это для вас. 17.06.2017size_t
оказывается типом возврата для всех stl-контейнеровsize()
и, конечно же, используется для индексации. Тем не менее индексы со знаком имеют некоторые преимущества в обнаружении ошибок и имеют отрицательные значения, которые можно использовать для обозначения неинициализированных. В большинстве случаев я предпочитаю хранить свои индексы как подписанные. 17.06.2017