所以我在C ++中创建了一个数独有效性检查器程序。该程序接收一个已完成的数独板的csv文件。该程序应该逐行读取文件并将数字放入2d数组(它做得很好)。我在检查连续是否有任何重复的数字时遇到困难(我假设如果我可以使这个工作,那么列应该非常相似)。我知道算法应该如何在我脑海中起作用,但我似乎无法将其纳入代码。
算法:
1)查看每一行并检查数字1到9,确保它们只出现一次(如果有的话)
2)如果找到重复(这意味着缺少某个数字)告诉用户错误被发现的行和列。
3)否则转到下一行并再次进行
我认为它应该是一个for循环运行这个但是很长一段时间以来我用C ++编码并且互联网上的任何内容对我都没有帮助。
感谢任何帮助。
到目前为止,这是我的代码:
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <thread>
using namespace std;
int *board[9];
int row, col;
void printBoard();
void is_row_ok();
int main()
{
for (int i = 0; i < 9; ++i)
{
board[i] = new int[9];
}
printBoard();
is_row_ok();
cout << endl;
return 0;
}
void printBoard()
{
string line;
string val;
ifstream myFile("Testfile1.txt");
for (int row = 0; row < 9; ++row)
{
string line;
getline(myFile, line);
if (!myFile.good())
break;
stringstream iss(line);
cout << endl;
for (int col = 0; col < 9; ++col)
{
string val;
getline(iss, val, ',');
if (!iss.good())
break;
stringstream convertor(val);
convertor >> board[row][col];
cout << board[row][col] << " ";
}
}
cout << endl;
cout << endl;
}
void is_row_ok()
{
bool found = false;
int i, j;
for (int i = 0; i < 10; ++i) //<------ edit starts here
{
int counter = 0;
for (int j = 0; j < 9; ++j)
{
if(board[row][j] == i)
{
cout << "Before " << counter << endl;
counter++;
cout << counter << endl;
}
if(counter > 1)
break;
}
}
}
答案 0 :(得分:2)
我能想到的最简单的方法是2个循环(一个在另一个内部):1让你通过数字1到9而另一个循环通过行的元素。带代码的小提示。
for(int i=1;i<10;i++){
int counter =0;
for(int j=0;j<9;j++){
if(board[row][j] ==i)counter ++;
}
if(counter >1) break; //here you check that there´s only one number on the row.
}
当然,还有其他方法可以做到这一点,这个方法非常基础且很慢。
------------------------------------- EDIT --------- ----------------------------------
您的功能应为bool
,以便知道是否有重复的数字。
bool is_row_ok(vector<vector<int> board)//I suggest you use vectors instead of arrays.
{
//i and j are declared on for, there´s no need to declare them again.
for (int i = 0; i < 10; ++i)
{
int counter = 0;
for (int j = 0; j < 9; ++j)
{
if(board[row][j] == i)counter++;
if(counter > 1)return false;
}
}
return true;
}
现在你在main上调用这个函数。如果函数返回true,则一切正常,如果返回false,则表示您有重复的数字。
int main(){
if(is_row_ok(board)cout<<"No number repeated"<<endl;
else cout << "Number repeated"<<endl;
return 0;
}
答案 1 :(得分:0)
我认为最简单的方法是使用std::sort
+ std::unique
,因为unique
会将迭代器返回到范围的新结尾。
#include <algorithm>
using namespace std;
int main()
{
int n[15] = { 1, 5, 4, 3, 6, 7, 5, 5, 5, 4, 2, 3, 9, 8, 9 };
int* end = n + 15;
sort(n, n + 15);
bool has_no_duplicates = (unique(n, n + 15) == end);
return 0;
}
这只是一个例子,但你应该明白这一点。