2017-10-03 12 views
-4

したがって、x、y座標のリストがあります。私は、座標のリストが値の行列のすべての行にまたがるか、列に対しても同じであるかどうかを調べたいと思います。ここでFind(x、y)座標のリストが行列の行または列にまたがっている場合

すなわち

T F F F 

T T F F 

F T F F 

F T T F 

それは[(0,0),(0,1),(1,1),(1,2),(1,3),(2,3)]ようなものになるだろうように、Tさんのグループは、座標として提供されています。これらの座標を使用して、それらが記述するセットが行列のすべての行にまたがることを知るにはどうすればよいですか?これは、列だけでなく、両方にも適用されます(行と列の両方にまたがるセットであるかどうか)。あなただけx sおよびy Sを複製・解除、および必要なインデックスにそれらを比較する必要が

struct coord { 
    int x, int y; 
} 
+0

あなたの例は、「スパン行ではなく列である」「列ではなく行にまたがる」「行と列の両方にまたがる」「行と列の両方にまたがる」ですか? – Caleth

+0

@Caleth - この例は「行ではありますが列ではありません」となっています.Tは各行にありますが、各列にはありません。 –

答えて

0

setには、Tによってタッチされた行と列のインデックス番号が含まれます。例:最初のTを考慮します。座標(0,0)を持つため、インデックス0の列にインデックスは0なので、行セットに0を、列セットに0を挿入します。次に、リストの2番目のTなどを考えます。

ループ外では、すべての行がタッチされたかどうかを調べるには、単純に行セットのサイズを問い合せます。行列の行数に等しい場合は、すべての行がタッチされ、Tの集合が行ごとに少なくともスパンされます。 同じことが列のセットに対して行います。

spansRowspansColの値に応じて、std::coutの値を指定できます。

0

値は、現在COORDのような構造体であるvector<vector<coord>>として保存されます。例えば。

std::set<int> required = { 0, 1, 2, 3 }; // values that must be present 

bool spans_direction(const std::vector<coord> & coords, std::function<int(coord)> projection) 
{ 
    std::set<int> projected; 
    std::transform(coords.begin(), coords.end(), std::inserter(projected, projected.end()), projection); 
    return projected == required; 
} 

bool spans_cols(const std::vector<coord> & coords) 
{ 
    return spans_direction(coords, [](coord c) { return c.x; }); 
} 

bool spans_rows(const std::vector<coord> & coords) 
{ 
    return spans_direction(coords, [](coord c) { return c.y; }); 
} 
+0

申し訳ありません。私はC++にはあまりにも新しいです。あなたはあなたが行っているアルゴリズムを説明していただけますか?私は本当にすべてのライブラリ関数を知っているわけではなく、これをすべてデコードしようとしていますが、何が起こっているのかを簡単に説明すると役に立ちます。 基本的にすべてのx値を区切り、それをセットに追加して重複しないようにして、必要と比較するだけですか? –

+0

はい、colsのx値とrowsのy値 – Caleth

0

我々は、すべてのx座標および別々のベクター内のすべてのy座標、ソートこれらのベクトルを格納し0-Nからの値は、nが否定である場合(各ベクター中に存在するかどうかを確認することができます。 xベクトル用の行とyベクトル用の列はありません)。

値が見つからない場合は、nより小さい値、0より大きい値などがあります。セットが行と列の両方にまたがっているかどうかは、答えがわかります。

std::vector<std::vector<coord>> Ts_pos; 
std::set<int> rows; 
std::set<int> cols; 

bool spansRow = false; 
bool spansCol = false; 

for (int i = 0; i < Ts_pos.size(); i++) 
{ 
    for (int j = 0; j < Ts_pos[i].size(); j++) 
    { 
     item = Ts_pos[i][j]; 

     cols.insert(item.x); 
     rows.insert(item.y); 
    } 
} 

if (rows.size() == numRows) spansRow = true; 
if (cols.size() == numCols) spansCol = true; 

ループを実行した後、両者を:あなたが持っているすべてがマトリックス(m x n = row x columnの大きさであると仮定すると)と座標(std::vector<std::vector<coord>>)の用語でT年代の位置、あなたが行うことができ

関連する問題