Codigo De Sudoku C++
Enviado por juandadky • 14 de Junio de 2014 • 407 Palabras (2 Páginas) • 347 Visitas
#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,'-');
...