各行/行ごとに数値が重複していないか確認するために、各行のチェック方法を調べようとしています。例えば各行/列の値がベクトル内で一意であるかどうかを調べる
、3×3のグリッドは、以下を取得言う:
グリッド:
{9, 7, 9}
{9, 6, 8}
{5, 1, 4}
最初の行9の重複を有し、第1の列も9
の重複を有しますどうすればこれらの問題を解決できますか?
各行/行ごとに数値が重複していないか確認するために、各行のチェック方法を調べようとしています。例えば各行/列の値がベクトル内で一意であるかどうかを調べる
、3×3のグリッドは、以下を取得言う:
グリッド:
{9, 7, 9}
{9, 6, 8}
{5, 1, 4}
最初の行9の重複を有し、第1の列も9
の重複を有しますどうすればこれらの問題を解決できますか?
unordered_setデータ構造を使用すると、重複をチェックする際の問題を解決できます。それはhashtable data structure
に基づいています。良いことは、一定時間O(1)で特定の要素を検索できることです。詳しくはhereをご覧ください。
n
unordered_set
のデータ構造が必要です。だからunordered_set
を含むvector
を持つ方が良いです。
がn
unordered_set
を格納するためのベクトルを定義します。
vector<unordered_set<int>> mySets(n);
を今、私はあなたが値0
を使用して特定の値をブロックすることを想定しています、しかし、0
はもともとあなたのグリッドに表示されない場合には、この仮定は唯一の真実であります。
だから、基本的に、我々は各列のunordered_set
を持っており、それがないとそのない0場合はj番目unordered_set
は、それが含まれているかどうj番目unordered_set
に位置(i,j)
に要素を挿入する前に、私たちは、その後、確認してくださいグリッドは解決策に達していません。そして、行のために我々はただ一つのunordered_set
、mySet
を保持し、各行を横断した後にクリアされます。
bool checkSolution()
{
unordered_set<int> mySet;//for each row
for (size_t i=0;i<myGrid.size();i++)
{
for (size_t j=0;j<myGrid[i].size();j++)
{
if(mySets[j].find(myGrid[i][j]) != mySets[j].end() && myGrid[i][j] != 0)
return false;
else
mySets[j].insert(myGrid[i][j]);
if(mySet.find(myGrid[i][j]) != mySet.end() && myGrid[i][j] != 0)
return false;
else
mySet.insert(myGrid[i][j]);
}
mySet.clear();
}
return true;
}
また、あなたはそれぞれの行のためのちょうど1の列のunordered_set
とn
unordered_set
を持っているソリューションを実装することができますが、その後はトラバースする必要があります。
checkSolution()
メソッドを実装することができますグリッドを列の大きな順に並べ替えます。
#include<iostream>
#include<vector>
#include<unordered_set>
using namespace std;
bool checkSolution();
int myGrid[3][3] = {{0,2,3},
{4,5,6},
{0,8,9}};// 0 indicates blocked values
int main()
{
if(checkSolution())
cout<<"No duplicates exist";
else cout<<"Duplicates exist";
}
bool checkSolution()
{
int n = 3;
vector<unordered_set<int> > mySets(n);
unordered_set<int> mySet;
for(int i = 0;i < sizeof(myGrid)/sizeof(myGrid[0]); ++i)
{
for(int j = 0;j < sizeof(myGrid[i])/sizeof(myGrid[0][0]);++j)
{
if(mySets[j].find(myGrid[i][j]) != mySets[j].end() && myGrid[i][j] != 0)
return false;
else mySets[j].insert(myGrid[i][j]);
if(mySet.find(myGrid[i][j]) != mySet.end() && myGrid[i][j] != 0)
return false;
else mySet.insert(myGrid[i][j]);
}
mySet.clear();
}
return true;
}
@charikedもしあなたがnがユーザ入力であり、私たちがnxnのグリッドを持っていれば、あなた自身があなたに言いました。 –
@charikedしたがって、基本的にnは列数(行数に等しい)になります。 –
ああ、ちょうど確かめたかった。ありがとう – chariked
* *あなたの行列になることはありません価値があります:
次のサンプルプログラムはありますか?例えばのように。 '-1'?その後、それをセンチネルとして使用し、重複をチェックするときにそれをチェックすることができます。 –
「ブロックされた」フィールドで何をしているのか、つまり値をどのように「ロールオーバー」するのかは不明です。たぶん、ブロックされているフラグを持つ独立したnxnブール構造を作成できますか? – slawekwin