ClubEnsayos.com - Ensayos de Calidad, Tareas y Monografias
Buscar

Codigo De Sudoku C++


Enviado por   •  14 de Junio de 2014  •  407 Palabras (2 Páginas)  •  322 Visitas

Página 1 de 2

#include "iostream"

#include "vector"

#include "algorithm"

#include "assert.h"

#include "conio.h"

#include "stdio.h"

using namespace std;

class Posibles{

vector<bool> _b;

public:

Posibles(): _b(9,true){};

bool activo(int v) const {return _b[v-1];}

void eliminar(int v){_b[v-1]=false;}

int num_activos() const {return count(_b.begin(),_b.end(),true);}

int val() const {

vector<bool>::const_iterator it=find(_b.begin(),_b.end(),true);

return 1+(it-_b.begin());

}

string str(int ancho) const;

};

string Posibles::str(int ancho) const {

string s(ancho,' ');

int j=0;

for(int i=1;i<=9;i++){

if(activo(i)) s[j++]=('0'+i);

}

return s;

}

class Sudoku {

vector<Posibles> _celdas;

static vector< vector<int> > _grupos,_gruposde,_vecinos;

public:

Sudoku(string s);

static void inicializa();

Posibles posibles(int k) { return _celdas[k];}

bool resuelto();

bool asigna(int k,int val);

bool elimina(int k,int val);

void escribe(ostream& o);

int menos_posibilidades();

};

bool Sudoku::resuelto(){

for(int k=0;k<_celdas.size();k++){

if(_celdas[k].num_activos() != 1)

{

return false;

}

}

return true;

}

bool Sudoku::asigna(int k,int val) {

for(int i=1;i<=9;i++){

if(i!=val) {

if(elimina(k,i)) return false;

}

}

return true;

}

bool Sudoku::elimina(int k,int val){

if(_celdas[k].activo(val)){

return true;

}

_celdas[k].eliminar(val);

const int N=_celdas[k].num_activos();

if(N==0){

return false;

} else if(N==1) {

const int v2=_celdas[k].val();

for(int i=0;i<_vecinos[k].size();i++){

if(!elimina(_vecinos[k][i],v2)) return false;

}

}

for(int x=0;x<3;x++) {

const int g=_grupos[k][x];

int n=0, k2;

for(int i=0;i<9;i++){

const int kp=_grupos[g][i];

if(_celdas[kp].activo(val)){

n++,k2=kp;

}

}

if(n==0){

return false;

} else if(n==1){

if(!asigna(k2,val)) return false;

}

}

return true;

}

void Sudoku::escribe(ostream& o) {

int ancho=2;

for(int k=0;k<_celdas.size();k++){

ancho=max(ancho,1+_celdas[k].num_activos());

}

string sep(3*ancho,'-');

for(int i=0;i<9;i++){

if(i==3

...

Descargar como (para miembros actualizados)  txt (4 Kb)  
Leer 1 página más »
Disponible sólo en Clubensayos.com