检查2d数组中的有效性 所以我在C++中创建了一个数独有效性检查程序。该程序接收一个csv文件和一个已经完成的数独板。程序应该逐行读取文件,并将数字放入一个2d数组(它做得很好)。我一直在检查一行中是否有重复的数字(我假设如果我能做到这一点,那么列应该相当相似)。我知道算法应该如何在我的脑海中运行,但我似乎无法将其转化为代码
算法: 1) 查看每一行,检查数字1到9,确保它们只出现一次(如果有) 2) 如果发现重复项(这意味着缺少某个数字),请告诉用户在哪一行和哪一列发现了错误 3) 否则,请转到下一行并再次执行 <>我认为它应该是一个for循环运行,但是自从我用C++编码了很久,而且在互联网上没有任何东西对我很有帮助。 感谢您的帮助 以下是我目前的代码:检查2d数组中的有效性 所以我在C++中创建了一个数独有效性检查程序。该程序接收一个csv文件和一个已经完成的数独板。程序应该逐行读取文件,并将数字放入一个2d数组(它做得很好)。我一直在检查一行中是否有重复的数字(我假设如果我能做到这一点,那么列应该相当相似)。我知道算法应该如何在我的脑海中运行,但我似乎无法将其转化为代码,c++,multidimensional-array,sudoku,C++,Multidimensional Array,Sudoku,算法: 1) 查看每一行,检查数字1到9,确保它们只出现一次(如果有) 2) 如果发现重复项(这意味着缺少某个数字),请告诉用户在哪一行和哪一列发现了错误 3) 否则,请转到下一行并再次执行 我认为它应该是一个for循环运行,但是自从我用C++编码了很久,而且在互联网上没有任何东西对我很有帮助。 感谢您的帮助 以下是我目前的代码: #include <iostream> #include <string> #include <fstream> #include
#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;
}
}
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
国际*董事会[9];
int row,col;
作废印刷板();
void是_row_ok();
int main()
{
对于(int i=0;i<9;++i)
{
板[i]=新的整数[9];
}
印制板();
行吗;
cout board[行][列];
cout我认为最简单的方法是使用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;
}
#包括
使用名称空间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;
排序(n,n+15);
bool没有重复项=(唯一的(n,n+15)=结束);
返回0;
}
这只是一个例子,但你应该明白这一点。我能想到的最简单的方法是两个循环(一个循环在另一个循环中):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.
}
现在在main上调用这个函数。若函数返回true,则一切正常;若它返回false,则有一个重复的数字
int main(){
if(is_row_ok(board)cout<<"No number repeated"<<endl;
else cout << "Number repeated"<<endl;
return 0;
}
intmain(){
如果我已经实现了上面的代码并添加了一些打印语句,当我运行它时,它会打印出一堆重复的“0之前”和“1”我做错什么了吗?您正在打印计数器,它是0或1。如果它是2,它将离开循环,所以是的,它可以。我看到您使用的是布尔值。我将编辑我的代码以使其工作。
int main(){
if(is_row_ok(board)cout<<"No number repeated"<<endl;
else cout << "Number repeated"<<endl;
return 0;
}