Bueno, creo que te has complicado un poco.
Empieza instalando un valor que indique que la casilla está vacía, yo he usado el 0 (aprovechando que 0 significa también false y cualquier otro número true).
El primer paso de meter el 5 y el 6 en la primera y última fila es muy sencillo ya que la matriz está vacía. Caigan donde caigan están bien.
Para incluir el 2 y el 3 tampoco tiene mucha complicación. Se corre la matriz por filas desde el inicio hasta penúltima fila. Por fila:
· Buscar una misma columna vacía para y e y+1
· En y incluir el 2.
· En y+1 incluir el 3.
Para incluir los entre números aprovecha las marcas de casilla vacía. Prepara una bandera para indicar si debes escribir los unos o no.
Por cada fila:
· desactiva la badnera
· Por cada columna:
· Si la bandera está desactivada y la casilla no está vacía:
· activa la bandera (Después de activar esa bandera no debes hacer nada y esperar a la siguiente iteración)
· Y si no:
· Si la casilla está vacía:
· escribe un 1 en ella
· Y si no:
· termina el bucle columna
Para terminar de rellenar la matriz recórrela casilla por casilla. Si la casilla está vacía introduce 1 o 4 aleatoriamente.
Esto en C11 quedaría así:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>
/* Matriz global por lo que
* al crearla se llena de ceros ( 0 )
* así que aprovecharé eso para
* marcar la posición vacía
*/
#define FILAS 4u
#define COLUMNAS 6u
int matriz[FILAS][COLUMNAS];
// devuelve una casilla vacia aleatoria
// en la fila y del array
unsigned columna_vacia_en_fila(unsigned fila) {
unsigned x;
do {
} while(matriz[fila][x] && matriz[fila+1][x]);
return x;
}
// incluir el 5 en la primera fila
// y el 6 en la última fila
void incluir_5_6() {
unsigned x;
matriz[0][x] = 5;
matriz[FILAS-1][x] = 6;
}
// incluir el 2 en fila y+1
// y el 3 en la fila y+1
void incluir_2_3() {
unsigned x, y;
for(y=0; y<FILAS-1; ++y) {
x = columna_vacia_en_fila(y);
matriz[y][x] = 2;
matriz[y+1][x] = 3;
}
}
// incluir el 1 entre dos números en una fila
// por cada fila
void incluir_1_entre() {
unsigned x, y;
bool escribir;
for(y=0; y<FILAS; ++y) {
escribir = false;
for(x=0; x<COLUMNAS; ++x) {
if(!escribir && matriz[y][x]) {
escribir = true;
}
else {
if(matriz[y][x]) break;
else matriz[y][x] = 1;
}
}
}
}
// rellenar indistintamente con 1
// y 4 las casillas que faltan
void incluir_1_4() {
unsigned x, y;
for(y=0; y<FILAS; ++y) {
for(x=0; x<COLUMNAS; ++x) {
if(matriz[y][x] == 0) {
matriz
[y
][x
] = rand()%2? 4 : 1; }
}
}
}
// imprimir la matriz
void imprimir() {
unsigned x, y;
for(y=0; y<FILAS; ++y) {
for(x=0; x<COLUMNAS; ++x) {
}
}
}
int main() {
incluir_5_6();
incluir_2_3();
incluir_1_entre();
incluir_1_4();
imprimir();
}
Gracias a un dato apuntado por NEBIRE en la siguiente respuesta me he dado cuenta de algo que se me había pasado por alto: el 2 y el 3 deben estar en la misma columna.
Solucionado en la reedición.