Hola, necesito de su ayuda, quiero imprimir pares de caracteres para toda la tabla, de forma aleatoria.
como
? # ¡ x
x ? # ¡
0 - + *
+ 0 - *
#include <stdio.h>
#include <stdlib.h> //incluye srand() y rand()
#include <conio.h>
#include <time.h> //incluye time()
char a[4][4]; //tamaño de la matriz
char cartas[]={'#','%','@','*','!','<','x'};
int total=sizeof(cartas);
int main()
{
srand(time(0));//numeros Aleatorios en funcion del tiempo
for (int i=0;i<4;i++)//para desplazarse por las columnas
{
for (int j=0;j<4;j++)//para desplazarse por las filas
{
a[i][j]=cartas[rand()%total];
printf("\t%c",a[i][j]);//imprime elemento de la matriz en pantalla
}
printf("\n\n");
}
getchar();
}
mi recomendación es que hagas otro array que reciba las 2 elementos que quieres usar...
tambien puede reorganizar tu array y solo usas los 2 primeros
No entiendo la pregunta.
¿Quieres encontrar dos caracteres iguales que haya en la tabla?
OK, me refiero a que quiero mostrar pares de caracteres para llenar mi tabla, de forma aleatoria.
Cita de: Yoldy en 9 Mayo 2017, 12:22 PM
OK, me refiero a que quiero mostrar pares de caracteres para llenar mi tabla, de forma aleatoria.
? # ¡ x
x ? # ¡
0 - + *
+ 0 - *
no entiendo lo de pares... ya te perdí.... ahí no veo los pares aclarados ni nada...
Ya entiendo, creo. La tabla debe tener dos unidades del mismo carácter en cualquier posición. Es decir: habrá un número tal de caracteres diferentes como la mitad de casillas de dicha tabla.
Pues deberás encontrar una forma de marcar los caracteres que han salido dos veces, para no incluirlos más.
Para darte ideas: usar una estructura que guarde el carácter y cuantas veces ha salido; usar un array adicional con correspondencia al de caracteres que indique cuantas veces ha salido un carácter; usar una lista enlazada donde se eliminen los caracteres que han salido dos veces.
Al arreglo cartas le falta 1 elemento, la matriz de 4x4 = 16 caracteres, y cartas tiene tamano 7.
Una idea alternativa es que modifiques el arreglo de cartas, eligiendo aleatoriamente desde el, y llevando al final o al inicio la carta elegida, y recorrerlo 2 veces. Con eso, no requieres memoria adicional, ninguna estructura de datos extra, y llevar donde vas en 1 indice adicional.
¿Podrías hacer un ejemplo de eso?
O(1) espacio
O(n) operaciones, n el tamaño del arreglo de cartas, la mitad de la matriz
Verlo ejecutándose aquí: http://goo.gl/KLHE8S
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
char a[4][4];
char cartas[] = {'#','%','@','*','!','<','x', '+'};
int total=sizeof(cartas);
int main()
{
int mover_a = total*2-1;
srand(time(0));
for (int i=0; i < 4; i++) {
for (int j=0; j < 4; j++) {
int hacia = mover_a % total;
int desde = rand() % (hacia + 1);
a[i][j] = cartas[desde];
cartas[desde] = cartas[hacia];
cartas[hacia] = a[i][j];
printf("\t%c ",a[i][j]);
mover_a--;
}
printf("\n\n");
}
}
Entiendo y es interesante. El array cambia en cada iteración, es muy aleatorio.
Aunque el segundo elemento del par solo puede volver a salir cuando han terminado de salir todos los símbolos, nunca podría generarse un patrón como el del ejemplo del enunciado.
Aunque, ahora que lo veo, los dos estamos equivocados XD
Es completamente posible que aparezca en la salida un patron como el del enunciado.
Hay que cambiar el arreglo de cartas para que incluya el "?" y sacar la "x" que puse yo sin fijarme.
No es por eso. En el ejemplo se toman los 4 primeros símbolos y se sitúan aleatoriamente en la primera línea. En la segunda línea se sitúan de nuevo los mismos símbolos pero con otra disposición. Después, ya en la tercera línea se usa un juego de símbolos diferentes y se actúa como en el casp anterior.
En tu código se disponen los ocho signos a la ves y no vuelven a repetirse hasta que no hayan salido todos.
En verdad la solución es muy parecida a la que propones solo que hay que hacerlo a medio array de símbolos cada vez.
Solo por jugar, para poder repetir los valores antes de llegar al final del arreglo cartas, se puede hacer un truco: usar la matriz final como memoria adicional y aplicar la misma idea anterior, e.g.: http://goo.gl/mOF4jJ
Aun no es como lo descrito, pero la idea se puede aplicar de multiples formas para evitar o forzar repeticiones, sin requerir de estructuras de datos adicionales o contar, la solucion funciona por construccion, como se demuestra en el codigo del link, el que copio aqui:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
char a[4][4];
char cartas[] = {'#','%','@','*','!','<','?', '+'};
int total=sizeof(cartas);
int main()
{
for(int i = 0; i < total*2; i++) {
a[i/4][i%4] = cartas[i%8];
}
srand(time(0));
for (int mover_a = total*2-1; mover_a >=0; mover_a--) {
int hacia = mover_a;
int desde = rand() % (hacia + 1);
char temp = a[hacia/4][hacia%4];
a[hacia/4][hacia%4] = a[desde/4][desde%4];
a[desde/4][desde%4] = temp;
printf("\t%c ",a[hacia/4][hacia%4]);
if(mover_a%4 == 0) printf("\n");
}
printf("\n\n");
}
Verlo ejecutando aqui; http://goo.gl/mOF4jJ
Yo decía algo más así:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
char cartas[] = {'#', '%', '@', '*', '!', '<', 'x', '+'};
int total = sizeof(cartas);
int main() {
int inicio = 0;
srand(time(NULL));
for (int mitad=0; mitad<2; ++mitad) {
for (int i=0; i<2; ++i) {
int longitud = total/2;
for (int j=0; j<4; ++j) {
int deja = longitud - 1 + inicio;;
int pilla;
do {
pilla = rand() % longitud + inicio;
} while(j < 3 && pilla == deja);
printf(" %c", cartas[pilla]);
char x = cartas[deja];
cartas[deja] = cartas[pilla];
cartas[pilla] = x;
--longitud;
}
puts("");
}
inicio = total/2;
}
}
Como puedes ver me he basado en tu idea.
Éste es el resultado:
# * @ %
@ % * #
! < + x
x + ! <
La primera fila y la segunda usan un conjunto de símbolo.
La tercera y la cuarta usan otro.
Super bueno.
Le falta la aritmetica para los indices de la matriz (y llenarla).
Sin embargo, agregarla diluye la magia de la simplicidad inicial.