Hola DotarSojat es importante que cuando pegues el código lo hagas utilizando las etiquetas [ code] ... [ /code] como se explica en
https://www.aprenderaprogramar.com/foros/index.php?topic=1460.0 si no lo haces así el código no se visuliza bien, aparecen cursivas indebidamente, etc.
Hay una cosa con vistas al desarrollo del programa que me parece deberías cambiar en la primera parte: al definir el tablero como 16 valores independientes denominados a11,a12,a13,a14,b11,b12,b13,b14,c11,c12,c13,c14,d11,d12,d13,d14
estás impidiendo (o dificultando) el tratamiento automatizado y recorrido de filas y columnas con bucles.
Para facilitar el tratamiento automatizado y matemático sería más adecuado usar un array o arreglo multidimensional, de modo que trabajes con un array a[][] de dos dimensiones. Si declaras a[4][4] los índices van a ir de 0 a 3. Para evitar tener que partir del índice cero si lo deseas puedes usar a[5][5] y despreciar el elemento de índice cero. Pero en este caso debes tener en cuenta que el número de elementos de cada índice del array no será el valor de length (5) sino length-1, es decir, 4.
Trabajando con arrays deberías evitar el uso de sentencias repetitivas como
if (((a11!=1) and (a11!=2) and (a11!=3) and (a11!=4)) or // condicional que evalua que la cadena introducida contenga numeros entre 1 y 4
((a12!=1) and (a12!=2) and (a12!=3) and (a12!=4)) or
El tratamiento sería basado en bucles e índices de los localizadores, evitando la repetición de código en la medida de lo posible.
El problema quizás se pueda resolver sin usar arrays, pero va a ser una solución menos correcta, más extensa y con más repetición de código.
Fíjate en la solución a sudoku planteada en este hilo (
https://www.aprenderaprogramar.com/foros/index.php?topic=1746), basada en arrays.
Luego hay otra cosa que no entiendo: en el primer código que has puesto defines 16 variables, pero en el segundo código sí has usado arreglos (arrays) ¿Por qué? ¿No se supone que es un mismo problema que vas solucionando por partes?
Salu2