您可以使用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,在第j个unordered_set中的(i,j)位置插入一个元素之前,我们检查第j个unordered_set是否包含它,如果它包含它,它不是 0,那么我们的网格还没有达到解。对于行,我们只保留一个unordered_set、mySet,在遍历每一行后将其清除。
现在您可以像这样实现您的 checkSolution() 方法:
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;
}
您还可以实现一个解决方案,其中列只有一个unordered_set,每行只有一个n unordered_set,但是您必须按列主要顺序遍历网格。
以下是一个示例程序:
#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;
}