Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Duda sobre matriz y función

Estas en el tema de Duda sobre matriz y función en el foro de C/C++ en Foros del Web. tengo que hacer una especie de sudoku, en donde me piden hacer cuatros funciones, VerificarTablero,MostrarTablero,verificardigito y colocarNumero, las dos primera las tenia hechas ( o ...
  #1 (permalink)  
Antiguo 06/07/2015, 17:57
 
Fecha de Ingreso: diciembre-2014
Mensajes: 2
Antigüedad: 9 años, 4 meses
Puntos: 0
Duda sobre matriz y función

tengo que hacer una especie de sudoku, en donde me piden hacer cuatros funciones, VerificarTablero,MostrarTablero,verificardigito y colocarNumero, las dos primera las tenia hechas ( o las tengo echas), pero las dos últimas son las que mas se me han complicado
la primera función es validar si un tablero contiene una solución valida ( Qué no haya número repetidos en filas, columna o cuadrante) esos serían los diferentes cuadrante, [[URL="http://prntscr.com/7pnmrp"]http://prntscr.com/7pnmrp[/URL]]esa función la hice así:
Código:
bool VerificarTablero() {

bool ver=true;

int cont=0,c=0;

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

if (mat[cont][j]==mat[i][j])
{cout<<"Solucion invalida"<<endl;}

ver=false;}
else
{cout<<"Solucion Valida"<<endl;
ver=true;}
}
}

cont++;








return (ver);
}
Pero ahora cuando lo ejecuto me da solución invalida muchas veces y no una como quisiera, (Ahí no verifique los cuadrante, solo las filas y columna, ya que no sabia como verificar cada cuadrante)
en la otra la hice como acción en donde solo mostre el tablero :
Código:
void MostrarTablero(){



for(int i=0;i<9;i++) {
for(int j=0;j<9;j++) {
cout<<mat[i][j];

}

cout<<endl;

}
las otras dos fue en la que pedí ayuda, porque no sabia como hacerlas
Funcion VerificarDigitos:
Código:
bool VerificarDigitos () {
bool validar=false;
int x,y,n;

cout<<"ingrese la coordenada x"<<endl;
cin>>x;
cout<<"ingrese la coordenada y"<<endl;
cin>>y;
cout<<"ingrese el valor"<<endl;
cin>>n;
for (int i =0; i<9; i++){
if (mat[x][i]==n || mat[i][y]==n) {
validar=true;
break;
}
if (validar==true){
cout<<"valor repetido"<<endl;
}

return (validar);
}
}
quisiera saber si me podrían ayudar en la primera función y en la tercera, ya que no me da como quería ni como pensé que me daría, si no es mucha la molestia
  #2 (permalink)  
Antiguo 07/07/2015, 00:58
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Duda sobre matriz y función

Buenos días.

Lo primero, el código acostúmbrate a decorarlo usando la opción que corresponda en el desplegable "Highlight". Con esto consigues dos cosas:

* Cumplir las normas del foro
* Que el código sea legible

Cita:
Iniciado por luchon78 Ver Mensaje
Pero ahora cuando lo ejecuto me da solución invalida muchas veces y no una como quisiera
A ver, si lo que estabas intentando ahí era comprobar filas y columnas... eso son dos bucles independientes, no dos anidados... además, cada bucle tiene que cubrir el rango (0,9]. Como además tienes que evitar comparar una celda consigo misma, cada bucle tendrá que incluir un if... algo tal que:


Código C++:
Ver original
  1. bool ver=true;
  2. for(int i=0; i<9 && ver; ++i )
  3. {
  4.   if( i != filaAct)
  5.     ver = mat[filaAct][colAct] != mat[i][colAct];
  6. }
  7.  
  8. for(int j=0; j<9 && ver; ++j )
  9. {
  10.   if( j != colAct)
  11.     ver = mat[filaAct][colAct] != mat[filaAct][j];
  12. }
  13.  
  14. if( ver )
  15.   cout << "Solución correcta" << endl;
  16. else
  17.   cout << "Solución incorrecta" << endl;

Al código anterior le faltan algunos detalles:
  • Hay que ejecutar los bucles para cada celda del sudoku... si te fijas hay dos variables filaAct y colAct que no están declaradas en ninguna parte
  • Hay que comprobar que no se repite ningún número dentro de un mismo cuadrante
  • El algoritmo debe dar una solución incorrecta si se encuentra con alguna celda que esté vacía, sin número asignado

La función verificarDigito ha de funcionar prácticamente igual que la función VerificarTablero... la única diferencia es que VerificarTablero tiene que chequear todas las celdas del sudoku mientras que verificarDigito únicamente debe preocuparse por chequear una celda... fíjate que si eres capaz de aislar el código que permite chequear una celda en una función independiente que reciba dos argumentos (la fila y la columna), la función VerificarTablero la construyes con dos bucles anidados (para recorrer el sudoku) y una llamada a esta nueva función.

Un saludo
  #3 (permalink)  
Antiguo 07/07/2015, 03:12
 
Fecha de Ingreso: febrero-2013
Mensajes: 115
Antigüedad: 11 años, 2 meses
Puntos: 5
Respuesta: Duda sobre matriz y función

Puedes hacer una funcion que te verifique un numero y con esta verificas el tablero entero...

A esta funcion le pasa como parametro un numero y la funcion va a verificar la fila y la columna que lo intersecta, si en la fila no esta el mismo numero, entonces pasa a la columna y si no esta entonces lo puedes ingresar, sino entonces te da el error...

Te dire la explicacion:

Creas una funcion que genere la matriz de 9x9 que es tu zudoku.
Haces la funcion que verifique un numero, como?
Bueno:
Código C++:
Ver original
  1. bool verificarNumero(int x, int y){//x, y son las coordenadas del numero en la matriz
  2.    /*aqui comparas ese numero con la fila y la columna que se intersectan donde colocaste el   numero si en la fila o en la columna se encuentra ese numero, entonces no va alli y da el error*/
  3. }

Luego creas la funcion que verifique el tablero completo
esta es un poco mas compleja pero puedes reciclar codigo, como creaste una funcion que te verifica un numero, lo que haras es llamarla dentro de esta....

Explicacion:
Código C++:
Ver original
  1. void verificarTablero(){
  2.         //hacemos un for anidado que recorra todo el tablero
  3.        for(int i = 0; i<9;i++){
  4.             for(j=0;j<9;j++){
  5.                  //y aqui llamamos a la funcion
  6.                if(!verificarNumero(i, j)){
  7.                   cout<<"No fue bien llenado";
  8.                   break;//y paramos el ciclo;
  9.               }
  10.             }
  11.        }
  12.   }

Si mal no recuerdo deberias parar tambien el primer for ya que seguira bucando, no recuerdo, pero asi es mas facil.... jejeje!! espero haberte podido ayudar... Saludos
__________________
http://tutorialesdelweb.blogspot.com/TutorialesWeb(principiantes)

Última edición por horusorion; 07/07/2015 a las 03:13 Razón: error

Etiquetas: funcion, int, matriz, numero
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:22.