Asi ha quedado:
Código PHP:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
enum booleanos {false,true};
void RandomSuffle(int **lista, int nElements){
//en un for voy recorriendo todos y calculo con rand la nueva posición y lo intercambio.
int x, y, pos, *aux;
for(y=0;y<nElements;y++){
pos=rand()%nElements;
if(pos != y){
aux=lista[pos];
lista[pos]=lista[y];
lista[y]=aux;
}
}
}
void RellenarDeltas(int **deltas){
int y, x, i=0;
for (y = -1; y <= 1; y++){
for(x = -1; x <= 1; x++){
if(!(x == 0 && y == 0)){
deltas[i][0]=y;
deltas[i][1]=x;
i++;
}
}
}
}
int main()
{
int z, x, i=0, nProbados, **deltas, **coordenadas, nFilas, nColumnas, Error=false;
struct{
int x;
int y;
}posicion;
srand(time(0));
nFilas=8;
nColumnas=2;
//Obtengo memoria dinamicamente para el array que contendrá los deltas
if(( deltas = (int**)malloc(nFilas*sizeof(int*))) == NULL){
Error = true;
}else{
for ( i = 0; i < nFilas; i++ ){
if(( deltas[i] = (int*)malloc(nColumnas*sizeof(int))) == NULL )
Error = true;
}
}
if(!Error){
i=0;
nFilas=10;
nColumnas=8;
nFilas *= nColumnas;
nColumnas=1;
if(( coordenadas = (int**)malloc(nFilas*sizeof(int*))) == NULL){
Error = true;
}else{
for ( i = 0; i < nFilas; i++ ){
if(( coordenadas[i] = (int*)malloc(nColumnas*sizeof(int))) == NULL ){
Error = true;
}
}
}
if(!Error){
for(i=0; i<nFilas; i++)
coordenadas[i][0]=i;
//Barajo las coordenadas posibles
RandomSuffle(coordenadas,nFilas*nColumnas);
nFilas=10;
nColumnas=8;
nProbados=0;
//Obtengo las coordenadas para X e Y
for(i=0; i<nColumnas*nFilas; i++){
posicion.x = coordenadas[i][0]%nColumnas;
posicion.y = coordenadas[i][0]/nColumnas;
RellenarDeltas(deltas);
RandomSuffle(deltas, 8);
for(z=0; z<8; z++){
//Aqui tengo que llamar a la funcion que haga uso de los deltas y de las coordenadas ya barajados
printf("X=%i, Y=%i, deltaX=%i, deltaY=%i\n", posicion.x, posicion.y, deltas[z][0], deltas[z][1]);
nProbados++;
}
}
printf("\nProbados %i opciones", nProbados);
}
}
getchar();
return 0;
}
Para ese caso en concreto probaria 640 posibilidades sin repetir ninguna y digamos que seria aleatorio el orden. Son 10 filas, 8 columnas y por cada posicion se pueden dar 8 combinaciones de deltas diferentes con lo que seria 8*10*8=640. Eso es lo que queria conseguir. Ahora me queda acomodarlo con el de la sopa de letras para que repita eso con cada palabra y listo. Se que tiene un coste de procesado y memoria elevados pero se acaba el problema del bucle infinito cuando no pueda acomodar la palabra.