miércoles, 4 de enero de 2017

Programa que resuelve sudokus en c++

Buenas, hice un programa que resuelve sudokus, el código no es muy complejo, pero me gustaria compartirlo con ustedes por si les puede ser de ayuda.


Este es el proyecto en github

Y aquí les dejo el código:



    #include 
#include 
using namespace std;


//Está es una estructura que tiene como atributo un arreglo bidimencional
//Se declaró como estructura para poder usarlo con "queue"
struct Estado{
 int tablero[9][9];
};

//Este tipo de dato nos permitirá usar sus funciones pull y push, las
//Cuales agregarán y eliminaran elemententos de la cola
queue  cola;
//Declramos la estructura previamente creada
Estado actual;
//Esto nos dirá en que casilla de las 81 disponibles estamos
int casilla=0;

//Esta función solamente pide los datos al  usuario

void generarTablero (){   
  for (int i = 0; i <9; i++)
   for(int j = 0; j <9; j++)
    cin >> actual.tablero[j][i];
}

//Con esto imrpimimos el tablero

void imprimirTablero(){
 cout <<"\n"<<"\n"<<"\n"; 
 
 for (int i = 0; i < 9; i++){
  for(int j = 0; j < 9; j++)
   cout << actual.tablero[j][i] << " ";
 cout <<"\n"; 
 }  
}

//Está función nos dice si se puede poner un numero en una casilla
//Es decir si no hay numeros repetidos, solocita el número que va a
//comparar y las coordenadas de su ubicación

bool isDisponible(int n, int x, int y){
 bool flag = 1;
 int rx,ry;
 
 for (int i = 0; i < 9; i++)
  if(actual.tablero[i][y] == n){
   flag =false;
   break;
  }
  
 if (flag)
  for (int i = 0; i < 9; i++)
   if(actual.tablero[x][i] == n){
    flag =false;
    break;
   }
   
 if(flag){  
  switch (x%3) {
  
   case 0 :
   
    rx = x;
    break;
    
   case 1 :
   
    rx = x - 1;
    break;
    
   case 2 :
   
    rx = x - 2;
    break;
    
   default :
   
    cout << "nonono";
  
  }
  
  switch (y%3) {
  
   case 0 :
   
    ry = y;
    break;
    
   case 1 :
   
    ry = y - 1;
    break;
    
   case 2 :
   
    ry = y - 2;
    break;
    
   default :
   
    cout << "soy default" <<"\n";
  
  }
  
  for (int i = 0; i < 3; i++)
   for (int j = 0; j < 3; j++)
    if (!(ry + i == y && rx + j == x))
     if(actual.tablero[rx+j][ry+i] == n){
      flag = false;
      break;
     }
 }
  
 return flag;
}

//Esta es la función que busca recursiamente los número que se asignaran
//Es decir la que como tal resuelve el problema

void buscar(){
  
  if(cola.size() > 0){
   actual = cola.front();
   cola.pop();
  }
  
  for (int y = 0; y < 9; y++){

   for (int x = 0; x < 9; x++){
    
    if (actual.tablero[x][y]==0){
     casilla++;
     
     for(int i = 1; i <= 9; i++){
      
      if (isDisponible(i,x,y)){
       actual.tablero[x][y] = i;
       cola.push(actual);    
      }
      
      else if (i == 9 && actual.tablero[x][y]==0){
      }
      
     }     
    buscar();
    }
   }
  } 
}

int main()
 {
  cin.tie(0);ios_base::sync_with_stdio(0);
  freopen("sudoku5.in", "r",stdin);
  
  //Si descomentamos la siguiente linea se generará un archivo con el resultado
 // freopen("sudoku.out", "w",stdout);
  generarTablero();
  buscar();
  imprimirTablero();
  
  return 0;
 }

lunes, 4 de mayo de 2015

aqui no hay nada

domingo, 17 de agosto de 2014

Memoria RAM

En esta ocasión voy a hacer una breve explicación acerca de la memoria RAM en una computadora, además de una explicación sobre las latencias que no es más que la velocidad en la que realiza operaciones una memoria. ¿Qué es una memoria RAM? Sus siglas en ingles significan: Random Access Memory. Es un espacio de almacenamiento de datos temporales que se necesitan para realizar algún cálculo o proceso en general. Supongamos que estamos en una base de taxis en la cual hay 15 personas que quieren ir al Zócalo y solo hay un taxi. El taxi representaría el total de la memoria que tenemos y el Zócalo representaría el procesador; como cada taxi simplemente tiene espacio para 5 personas tendrá que realizar 6 viajes contando ida y vuelta, entonces mientras más taxis hayan, o mientras más espacio tenga cada taxi, más pronto terminará de llevar a las personas, por lo tanto, entre mayor memoria, mayor velocidad para ejercer los procesos. Latencias de la memoria. La latencias no son muy importantes cuando se habla de una máquina de oficina u hogareña, donde realmente importa es una máquina gamer o high-end. Las latencias en si son intervalos de tiempo que miden cuánto tarda el módulo de memoria en realizar alguna operación interna determinada, Éstas se muestran de la siguiente manera:




Volviendo al ejemplo de los taxis entre mayor sea la velocidad en que viaja el taxi, más rápido llegará a su destino.

Cada número de esta serie (2-2-2-5) representa cuantos ciclos de reloj le tomara a la memoria realizar una operación determinada.
Cada número representa una operación y siempre se presentan en el mismo orden. Entre más bajo sea el número más rápido hará la operación.
En orden, éstas son las operaciones:
- CL: CAS Latency. Es el tiempo que transcurre entre que el procesador hace la petición de cierto dato y la memoria lo entrega.
- tRCD: RAS to CAS Delay. Es el tiempo que transcurre entre la activación de la línea (RAS) y la columna (CAS) donde el dato está alojado.
- tRP: RAS Precharge. Es el tiempo que transcurre entre que se deshabilita el acceso a una línea de datos y comienza el acceso a una nueva línea.
- tRAS: Active to Precharge Delay. Cuanto tiempo la memoria debe esperar hasta que el próximo acceso a la memoria pueda iniciarse.
- CMD: Command Rate. El tiempo que transcurre entre que el chip de memoria es activado y el momento en el cual el primer comando ya puede ser enviado a la memoria. A veces este valor es omitido. En otras ocasiones puede aparecer como T1 (1 ciclo de reloj) o T2 (2 ciclos de reloj).

Sin embargo, en el caso de Windows con arquitectura de 32 bits solo es posible reconocer hasta 3 GB de RAM por lo cuál se recomienda que en caso de añadirle más de 3 GB uses el Sistema operativo de 64 bits.


http://polinsecure.tk/
Sígueme en facebook
 Sígueme en google+