questi sono i 3 file mi da problema con items mi dice was not declared in this scope, lo dichiaro nel main ma nemmeno funziona e tra l' altro la cosa non ha senso dal momento che lo ho dichiarato nella superclasse vector2d e passato alla classe sudoku con l' ereditarietà.
classi.h
codice:
#include <iostream>
#include <cstdio>
#include <string>
#include <cstdlib>
#include<fstream>
#include<math.h>
#include<iomanip>
#include<vector>
using namespace std;
typedef vector< vector <int> > vettore;
const int UNASSIGNED =0;
class vector2d{
public:
vettore items;
void StampaGriglia(vettore,int ,int &);
void Crea_griglia(vettore &,int &);
};
class Sudoku: public vector2d
{
private:
int rig,col,num,SettoreInizioRig,SettoreInizioCol;
bool CercaNonAssegnate(vettore, int &, int &,int );
bool NumCerto(vettore, int , int , int ,int );
bool UsedInRig(vettore, int , int ,int );
bool UsedInCol(vettore, int , int ,int );
bool UsedInBox(vettore, int , int , int ,int );
public:
bool SudokuSolver(vettore,int ,int &);
};
main.cpp
codice:
#include "classi.h"
int main()
{
int cont=0;
int n=0;
vector2d s;//dichiaro una variabile di tipo sudoku per richiamare i metodi della classe
Sudoku v;
s.Crea_griglia(items,n);
if (v.SudokuSolver(items,n,cont) == true){// se il metodo SudokuSolver mi ritorna vero allora stampa la soluzione
cout<<"\n\nLa soluzione del sudoku e': \n";
s.StampaGriglia(items,n,cont);
cout<<"\n\nSoluzione Trovata dopo "<<cont<<" cicli\n\n";
}
else
cout<<"Non esistono soluzioni."<<endl;
return 0;
}
sudoku.cpp
codice:
#include "classi.h"
bool Sudoku::SudokuSolver(vettore items,int n,int &cont)
{
cont++;
if(cont%50000000==0){
cout<<"\n\nSoluzione parziale sudoku al ciclo "<<cont<<":\n\n";
StampaGriglia(items,n,cont);
system("pause");
}
int rig, col;
if (!CercaNonAssegnate(items, rig, col,n))//valore sicuro assegnato non ci ripasso più
return true;
for (int num = 1; num <= n; num++)
{
if (NumCerto(items, rig, col, num,n))
{
items[rig][col] = num;
if (SudokuSolver(items,n,cont))//Backtracking: chiamata ricorsiva
return true;
items[rig][col] = UNASSIGNED;
}
}
return false;
}
//Questo metodo mi cerca una cella non ancora assegnata
bool Sudoku::CercaNonAssegnate(vettore items, int &rig, int &col,int n)
{
for (rig = 0; rig < n; rig++)
for (col = 0; col < n; col++)
if (items[rig][col] == UNASSIGNED)//quando trovo uno zero in una casella ritorno vero
return true;
return false;
}
//Questo metodo mi dice se quel numero è gia usato in quella riga
bool Sudoku::UsedInRig(vettore items, int rig, int num,int n)
{
for (int col = 0; col < n; col++)//scorrendo le colonne vedo gli elementi della riga
if (items[rig][col] == num)
return true;
return false;
}
//Questo metodo mi dice se quel numero è gia usato in quella colonna
bool Sudoku::UsedInCol(vettore items, int col, int num,int n)
{
for (int rig = 0; rig < n; rig++)//scorrendo le righe vedo gli elementi della colonna
if (items[rig][col] == num)
return true;
return false;
}
//Questo metodo mi dice se quel numero è gia usato in quel box
//Per box intendo il settore considerato
bool Sudoku::UsedInBox(vettore items, int SettoreInizioRig, int SettoreInizioCol, int num,int n)
{
for (int rig = 0; rig < (int)sqrt(n); rig++)
for (int col = 0; col < (int)sqrt(n); col++)
if (items[rig+SettoreInizioRig][col+SettoreInizioCol] == num)
return true;
return false;
}
//Mi dice la casella sicura dove posso inserire il numero
bool Sudoku::NumCerto(vettore items, int rig, int col, int num,int n)
{ //se tutti e tre sono falsi cioè non sta in riga non sta in colonna non sta nel box allora il numero è sicuro
return !UsedInRig(items, rig, num,n) && !UsedInCol(items, col, num,n) &&
!UsedInBox(items, rig - rig % (int)sqrt(n) , col - col % (int)sqrt(n), num,n);
}
// Stampa della griglia
void vector2d::StampaGriglia(vettore items,int n,int &cont)
{
ofstream fout;//Dichiarazione variabile che mi permette di scrivere su file
fout.open("cicli sudoku.txt", ios::app);//apro un file in modalità append per "appendere" più output
if(cont%5000==0)//questo if serve per stampare ogni 5000 cicli la soluzione parziale del sudoku
fout<<"\n\n Soluzione parziale sudoku al ciclo "<<cont<<":\n\n";
for (int rig = 0; rig < n; rig++)
{
for (int col = 0; col < n; col++){
cout<<setw(3)<<items[rig][col]<<" ";//stampo in output la matrice
fout<<setw(3)<<items[rig][col]<<" ";}//stampo su file la matrice
cout<<endl;
fout<<endl;
}
fout<<"\n------------------------------------------------------------------------------------------\n";
fout.close();
}
void vector2d::Crea_griglia(vettore &items ,int &n) // Si devono passare entrambe le variabili per riferimento
{
string nomefile;
cout<<"Inserire il nome del file: ";
cin>>nomefile;
int temp;
nomefile+=".txt";//concateno il nome del file con la sua estensione
ifstream fin(nomefile.c_str());//Sto operando sul file chiamato "nomefile"
if( ! fin.is_open() ) // controllo che il file sia aperto
return;
fin>>n;//acquisisco dal fine la dimensione della griglia
for ( int i = 0; i < n; i++ ) {
items.push_back ( vector<int>() );
for ( int j = 0; j < n; j++ )
fin>>temp;
items[i].push_back ( temp );
}
fin.close();
}