El propósito del programa ( C++ ) es leer de teclado un array de 9x9 y decir si se trata de una tablero sudoku. Los requisitos para que un array sea sudoku son:
- En la fila del tablero no puede haber números repetidos (sin contar el 0)
- En cada columna no puede haber números repetidos (sin contar el 0)
- Un tablero sudoku se divide en 9 regiones de 3x3. En una misma región no puede haber números repetidos. (adjunto ejemplo abajo).
Mi problema es que no se como hacer para comprobar esta ultima opción, ya que he tratado de hacerlo pero no funciona de la manera en que lo he hecho. (adjunto tb el código). Adjunto también la captura del error que me da.
#include <iostream>
#include <array>
#include <string>
using namespace std;
const int MAX=9;
typedef array <int,MAX> Filas;
typedef array <Filas,MAX> Sudoku;
void leersudoku (Sudoku& m)
{
cout<<"Introduzca un tableto de sudoku de "<<MAX<<"x"<<MAX<<": "<<endl;
for (int f=0; f<int(m.size()); ++f)
{
for (int c=0; c<int(m[f].size()); ++c)
{
cin>>m[f][c];
}
}
}
bool repeticionfila (const Sudoku& m, int f)
{
bool control=true;
for (int c=0; c<int(m[f].size())-1; ++c)
{
if ((m[f][c]==m[f][c+1])&&(m[f][c]!=0))
{
control=false;
}
}
return control;
}
bool repeticioncolumna (const Sudoku& m, int c)
{
bool control=true;
for (int f=0; c<int(m[f].size())-1; ++f)
{
if ((m[f][c]==m[f+1][c])&&(m[f][c]!=0))
{
control=false;
}
}
return control;
}
bool comprobarconresto (const Sudoku& m, int f, int c, int j)
{
int cnt=m[f][c];
bool control=true;
for (int f=0; f<j; ++f)
{
for (int c=0; c<j; ++c)
{
if ((m[f][c]==cnt)&&(m[f][c]!=0))
{
control=false;
}
}
}
return control;
}
bool comprobarmatrizespecficica (const Sudoku& m, int f, int c, int j)
{
bool control=true;
for (int x=f; x<j; ++x)
{
for (int y=c; y<j; ++y)
{
if(comprobarconresto(m,x,y,j)==false)
{
control=false;
}
}
}
return control;
}
void comprobarvalido (const Sudoku& m)
{
bool es_valido=true;
//--------------------------------------
for (int f=0; f<int(m.size()); ++f)
{
for (int c=0; c<int(m[f].size()); ++c)
{
if ((m[f][c]<0)||(m[f][c]>9))
{
es_valido=false;
}
}
}
//--------------------------------------
for (int f=0; f<int(m.size()); ++f)
{
if (repeticionfila(m,f)==false)
{
es_valido=false;
}
}
//--------------------------------------
for (int c=0; c<int(m[0].size()); ++c)
{
if(repeticioncolumna(m,c)==false)
{
es_valido=false;
}
}
//--------------------------------------
for (int i=0; i<=2; ++i)
{
for (int f=3*i; f<int(m.size())-(6-3*i); ++f)
{
for (int c=3*i; c<int(m.size())-(6-3*i); ++c)
{
if(comprobarmatrizespecficica(m,f,c,int(m.size())-(6-3*i))==false)
{
es_valido=false;
}
}
}
}
//--------------------------------------
if (es_valido==true)
{
cout<<"Este tablero de sudoku es valido"<<endl;
}
else
{
cout<<"Este tablero de sudoku no es valido"<<endl;
}
}
int main ()
{
Sudoku m;
leersudoku(m);
comprobarvalido(m);
}