2016-11-16 20 views
0

テトリスのような形を入力できるプログラムを作成しています。私はそれらの2-Dベクトルのそれぞれにポイント多次元ベクトルへのポインタベクトル内の要素にアクセスする

110 | 1 | 111 
011 | 1 | 010 
     | 1 | 111 
// Where a 0 denotes "empty space" 

とベクトルと呼ばれる形でこれらのポインタを格納します。彼らは、その後のようになりますので、私は、ブール値の2次元ベクトルでこれらの形状を格納します。 私の問題は、個々の0と1を(他の図形と比較するために)アクセスすることにあります。例えば

、所与:

私は以前に与えた2-Dベクターを指す三つの要素を有する形状は、I(0、1)の位置に1にアクセスできるようにする
vector<vector<bool> > Shape; 
vector<Shape *> shapes; 

を第1の形状のものである。

私が試した:他の多くのものの中で

shapes[index]->at(0).at(1); 
shapes[index]->at(0)[1]; 
shapes[index][0][1]; 

のが、これらのどれも私が欲しいものを私に与えているように見えません。私はまだかなり指摘していますので、私はぼんやりとした何かを逃していないことを願っています。

ありがとうございます!

リクエストごとに、ここには私のコードの大きな部分があります。この中

#include <iostream> 
#include <cstdio> 
#include <string> 
#include <vector> 
#include <sstream> 
using namespace std; 

typedef vector<vector<bool> > Shape; 

class ShapeShifter { 
public: 
    ShapeShifter(int argc, char **argv); 
    void Apply(int index, int row, int col); 
    bool FindSolution(int index); 
    void AddShape(Shape *newShape); 
    void AddMove(int index, int row, int col); 
    void PrintMoves(); 
    void PrintGrid(); 
protected: 
    vector<vector<bool> > grid; 
    vector<Shape *> shapes; 
    vector<string> moves; 
}; 

void ShapeShifter::Apply(int index, int row, int col) { 
    int i, j, k; 
    int y = 0, z = 0; 

    if((row + shapes[index]->size() > grid.size()) || (col + shapes[index]->at(0).size() > grid[0].size())) { 
     return; // shape won't fit 
    } 

    for(i = row; i < (row + shapes[index]->size()); i++) { 
     for(j = col; j < (col + shapes[index]->at(0).size()); j++) { 
      if(shapes[index]->at(y)[z] == 1) { 
       if(grid[i][j] == 0) { 
        grid[i][j] = 1; 
       } 
       else { 
        grid[i][j] = 0; 
       } 

      } 
      z++; 
     } 
     z = 0; 
     y++; 
    } 
    return; 
} 

私はboolsのグリッドを持っていると私は形状が1を持っている場合、グリッドの対応する要素におけるブール値を反転します指定されたインデックス、内形でそれをマスクしようとしています。

形状ベクトルはそうのような標準入力の行が移入された:なぜあなたはstringのベクトルを使用している

ShapeShifter sshift(argc, argv); 
Shape *newShape; 
vector<bool> shapeLine; 
int i, j; 
string line; 

while(getline(cin, line)) { 
    j = 0; 
    newShape = new Shape; 
    for(i = 0; i < line.size(); i++) { 
     if(line[i] == ' ') { 
      j++; 
     } 
     else { 
      shapeLine.push_back(line[i] - '0'); 
     } 
    } 
    newShape->push_back(shapeLine); 
    sshift.AddShape(newShape); 
    line.clear(); 
} 

void ShapeShifter::AddShape(Shape *newShape) { 
    shapes.push_back(newShape); 
} 
+0

'私の言いwant'何私に何を与えていますか?あなたは何を期待していますか?何を手に入れますか? –

+2

ビットとコードの投稿は役に立ちません。 [mcve]を投稿してください。 –

+0

最後に投稿した3つの式を評価すると、どのような価値が得られますか。 –

答えて

0

と文字だけではなく2次元配列か、何が必要?その後、簡単にアクセスできます:shape[x][y]。とにかく

、あなたは現在、それはあなたがこのようにあなたがしたい値にアクセスすることができます設定している方法: shapes[0]->at(0).at(1);

+0

'shapes [0]'がポインタとして評価されるので、これは動作しません。 'ベクトル'にアクセスするには、逆参照する必要があります。 –

+0

Woopsは、 'Shape *'を使って、 ' - >' –

+0

に間違ったtypedefを含めると、実際にはベクトル>、ではなく、 –

関連する問題