Resoldre un Sudoku amb Backtracking
Per a tots aquells que no sapigueu què és el Backtracking aquí us deixo l'enllaç de la wikipedia (en anglès): aquí
Doncs bé, aquí teniu un programa escrit en c++ que resol un sudoku utilitzant l'algorisme Backtracking (tornada enrere). Sense dubte que no és la manera més eficient per resoldre el sudoku però trobo que és un exemple interessant per saber com funciona.
El programa només l'he provat al Linux i desconec si funciona al windows, per tant... ;D
Us deixo un enllaç cap a un fitxer comprimit (rar) amb el codi sencer i un exemple: Codi font
Doncs bé, aquí teniu un programa escrit en c++ que resol un sudoku utilitzant l'algorisme Backtracking (tornada enrere). Sense dubte que no és la manera més eficient per resoldre el sudoku però trobo que és un exemple interessant per saber com funciona.
El programa només l'he provat al Linux i desconec si funciona al windows, per tant... ;D
Us deixo un enllaç cap a un fitxer comprimit (rar) amb el codi sencer i un exemple: Codi font
--------------- INICI PROGRAMA ---------------
#include
#include
using namespace std;
typedef vector<> > plantilla;
class Sudoku {
private:
plantilla P; //conté el sudoku
plantilla copia; //coneix quines caselles vénen marcades des d'un inici
static const int N_CELES = 3;
static const int N = 9; // nombre de vèrtexs
static const int OCUPADA = -1;//cel.la ocupada inicialment
static const int LLIURE = 0;//l'has d'emplenar
int op;//quantes vegades s'ha accedit a la funció recursiu
bool comprova_zona(int x, int y) {
//comprova si la cel.la de 3 x 3 és vàlida
vector
int ME = (x / N_CELES) * N_CELES;
int MD = ME + N_CELES;
int MS = (y / N_CELES) * N_CELES;
int MI = MS + N_CELES;
int pos_X_ACT = x;
int pos_Y_ACT = y;
for(int i = ME; i < j =" MS;" valor =" P[i][j]" y =" 0;"> horit(N, LLIURE);
for(int i = 0; i < valor =" P[i][y]" x =" 0;"> vert(N, LLIURE);
for (int i = 0; i < valor =" P[x][i]" i =" 0;" j =" 0;" i =" 0;" j =" 0;" x =" cas" y =" cas" x = " << x; //cout << " y =" " cas ="=" i =" 0;">P = G;
copia = fer_sombra(P);
op = 0;
recursiu(0);
//cout << "es valid? " << n =" 9;" i =" 0;" j =" 0;">> k;
G[i][j] = k;//0 si és un camp en blanc, l'usuari l'haurà d'emplenar
}
}
return G;
}
int main () {
Sudoku sud(llegir_graf());
cout << "operacions: " <<>
Comentaris
Hi hauries d'uncluir:
#include v strath v
#include v modals v
#include v ssaten v
#include v ridho v
i al final
class(){
brq::std;
OK!
Hauré de canviar la manera de publicar el fitxer.
Salut!