Red de conocimiento informático - Conocimiento sistemático - ¿Cómo encontrar el cuadrado mágico de un número primo? (lenguaje c)

¿Cómo encontrar el cuadrado mágico de un número primo? (lenguaje c)

Para el nivel 4, se puede considerar una búsqueda recursiva directa. Probé la solución 2992.

1 2 11 12

4 9 8 5

7 10 3 14

6 13 16 15

1 2 11 12

4 9 8 5

13 10 3 14

6 7 16 15

1 2 11 12

4 15 8 5

7 16 3 14

6 13 10 9

1 2 11 12

4 15 8 5

13 16 3 14

6 7 10 9

1 2 11 12

10 3 8 5

p>

7 16 15 14

6 13 4 9

1 2 11 12

10 3 8 5

13 16 15 14

6 7 4 9

1 2 11 12

10 9 8 5

7 4 3 14

6 13 16 15

1 2 11 12

10 9 8 5

7 4 15 14

6 13 16 3

1 2 11 12

10 9 8 5

13 4 3 14

6 7 16 15

1 2 11 12

10 9 8 5

13 4 15 14

6 7 16 3

... .........

#include

#include

# incluir < windows.h >

#define MAX_NUM 30

#define _PRINT_ 0

Resultado largo sin firmar[MAX_NUM * MAX_NUM], ResultNum, Usado[MAX_NUM * MAX_ NUM]={ 0};

bool PrimeTable[MAX_NUM * MAX_NUM * 2]={ false };

N largo sin firmar

void; CreatePrimeTable(void)

{

PrimeTable[0]=false

PrimeTable[1]=false; ]=verdadero;

PrimeTable[3]=verdadero

para(unsigned long j=5; j < ;= MAX_NUM * MAX_NUM * 2; j+=2)

{

PrimeTable[j]=true;

for(unsigned long i=3; i <= sqrt((double)j); i+=2)

{

if (j % i == 0)

{

PrimeTable[j]=false

<; p> descanso

}

}

}

}

}

}

bool en línea IsPrim

e(n largo sin firmar)

{

return PrimeTable[n];

}

bool CheckIt(profundo largo sin firmar)

{

if(Profundo == 0)

{

devuelve verdadero

}

else if(Profundo < N)

{

return IsPrime(Resultado[Profundo] + Resultado[Profundo - 1]);

}

De lo contrario, if (Deep % N == 0)

{

Devuelve IsPrime(Resultado[Deep] + Resultado [Profundo - N]);

}

De lo contrario

{

Devuelve IsPrime(Resultado[Profundo] + Resultado[Profundo - 1]) &.

}

void go(unsigned long Deep)

{

if(Deep == QN)

{

p> ResultNum++;

#if (_PRINT_)

printf("¡Encuéntralo! No.%lu\n" , ResultNum);

for(unsigned long i=0; i < QN; i++)

{

printf("%lu\t", Resultado [i]);

if(i % N == N - 1)

{

printf("\n");

}

#if (_PRINT_)

printf("¡Encuéntralo!

}

#else

printf("\rFind:%lu", ResultNum);

#endif

}

else

{

for(unsigned long i=1; i <= QN; ++i)

{

if(!Used[i])

{

Resultado[Deep]=i

if(CheckIt(Deep))

{

Usado[i ]=1;

ir(Profundo + 1);

Usado[i]=0; p>

}

{

}

}

int main()

{

DWORD tim;

NumResultado=0;

printf("Entrada N. ");

Entrada N: ");

scanf("%lu", &N);

QN=N * N

tim=GetTickCount(); ();

go(0);

printf("\n\nN=%lu\n",

p);

rintf("Total=%lu\n" , ResultNum);

printf("Tiempo=%lu\n", GetTickCount() -

return 0; /p>

}

Respecto a preguntas adicionales:

Adyacente no incluye direcciones diagonales, ¿verdad? Adyacente no significa arriba y abajo, izquierda y derecha... simplemente agregue otro caso si incluye una barra. Pero llevará más tiempo usarlo