O documento descreve um algoritmo para resolver o problema das oito rainhas em um tabuleiro de xadrez de tamanho N x N colocando as rainhas de forma que nenhuma possa capturar a outra. O algoritmo verifica todas as posições possíveis recursivamente e imprime as soluções válidas.
6. #define FALSE 0
#define TRUE 1
int N;
int salvaPosicaoRainha(int linhas[N], int x, int y)
{
int i;
if (y == 0)
return 1;
for (i=0; i < y; ++i) {
if (linhas[i] == x || linhas[i] == x + y - i ||
linhas[i] == x - y +i
return 0;
}
return 1;
}
2
7. int main()
{
int x;
printf(“n Digite a dimenção do tabuleiro:
scanf(“%d”, &N);
int linhas[N];
n_rainhas(linhas, 0);
return 0;
}
void n_rainhas(int linhas[N], int y)
{
int x;
for (x=0; x < N; ++x) {
if (salvaPosicaoRainha(linhas, x , y))
linhas[y] = x;
if (y == N-1)
imprimirSolucoesPossiveis(linhas);
else
n_rainhas(linhas, y+1);
}
}
}
void imprimirSolucoesPossiveis(int
linhas[N])
{
static int s = 0
int x, y,cont;
printf(“nn Solucao %d: nn”, ++s);
for (y=0; y < N; y++) {
for (x=0; x < N; x++){
if(x == linhas[y]){
if((x+y%) 2==0)
printf(“ R “);
else
printf(“xdbRxdb”);
}else{
if((x+y)%2==0){
printf(“ “);
}else{
printf(“xdbxdb
xdb”);
}
}
}
printf(“n”);
}
}
8. int main()
{
int x;
printf(“n Digite a
dimenção do tabuleiro: “);
scanf(“%d”, &N);
int linhas[N];
n_rainhas(linhas, 0);
return 0;
}
9. 4
4
int main()
{
int x;
printf(“n Digite a
dimenção do tabuleiro: “);
scanf(“%d”,& );
int linhas[ ];
n_rainhas(linhas, 0);
return 0;
}
0 1 2 3
0123
10. 0 1 2 3
0123
void n_rainhas(int linhas[N], int y)
{
int x;
for (x=0; x < N; ++x) {
if (salvaPosicaoRainha(linhas, x , y)) {
linhas[y] = x;
if (y == N-1)
imprimirSolucoesPossiveis(linhas);
else
n_rainhas(linhas, y+1);
}
}
}
11. 0 1 2 3
0123
void n_rainhas(int linhas[4], int 0)
{
int x;
for (x=0; x < 4; ++x) {
if (salvaPosicaoRainha(linhas, x , y)) {
linhas[y] = x;
if (y == 4-1)
imprimirSolucoesPossiveis(linhas);
else
n_rainhas(linhas, 0+1);
}
}
}
12. 0 1 2 3
0123
int N;
int salvaPosicaoRainha(int linhas[4], int 0, int 0)
{
int i;
if (y == 0)
return 1;
for (i=0; i < 0; ++i) {
if (linhas[i] == x || linhas[i] == x + y - i ||
linhas[i] == x - y +i
return 0;
}
return 1;
}
13. 0 1 2 3
0123
void n_rainhas(int linhas[4], int 0)
{
int x;
for (x=0; x < 4; ++x) {
if (salvaPosicaoRainha(linhas, 0 , 0)) {
linhas[0] = 0;
if (0 == 4-1)
imprimirSolucoesPossiveis(linhas);
else
n_rainhas(linhas, 0+1);
}
}
}
14. 0 1 2 3
0123
void n_rainhas(int linhas[4], int 1)
{
int x;
for (x=0; x < 4; ++x) {
if (salvaPosicaoRainha(linhas, 0 , 1)) {
linhas[1] = 0;
if (0 == 4-1)
imprimirSolucoesPossiveis(linhas);
else
n_rainhas(linhas, 0+1);
}
}
}
15. 0 1 2 3
0123
int N;
int salvaPosicaoRainha(int linhas[4], int 0, int 1)
{
int i;
if (1 == 0)
return 1;
for (i=0; i < 1; ++i) {
if (linhas[i] == 0 || linhas[i] == 0 + 1 - i ||
linhas[i] == 0 - 1 +i
return 0;
}
return 1;
}
16. 0 1 2 3
0123
void n_rainhas(int linhas[4], int y ==1)
{
int x;
for (x=0; 1 < 4; ++x) {
if (salvaPosicaoRainha(linhas, 1 , 1)) {
linhas[1] = x;
if (y == 4-1)
imprimirSolucoesPossiveis(linhas);
else
n_rainhas(linhas, y+1);
}
}
}
17. 0 1 2 3
0123
void n_rainhas(int linhas[4], int y ==1)
{
int x;
for (x=0; 2 < 4; ++x) {
if (salvaPosicaoRainha(linhas, 2 , 1)) {
linhas[1] = 2;
if (y == 4-1)
imprimirSolucoesPossiveis(linhas);
else
n_rainhas(linhas, y+1);
}
}
}
18. 0 1 2 3
0123
int N;
int salvaPosicaoRainha(int linhas[4], int 2, int 1)
{
int i;
if (1 == 0)
return 1;
for (i=0; i < 1; ++i) {
if (linhas[i] == 2 || linhas[i] == 2 + 1 - i ||
linhas[i] == 2 - 1 +i
return 0;
}
return 1;
}
19. 0 1 2 3
0123
void n_rainhas(int linhas[4], int y ==1)
{
int x;
for (x=0; 2 < 4; ++x) {
if (salvaPosicaoRainha(linhas, 2 , 1)) {
linhas[1] = 2;
if (y == 4-1)
imprimirSolucoesPossiveis(linhas);
else
n_rainhas(linhas, y+1);
}
}
}
20. 0 1 2 3
0123
void n_rainhas(int linhas[4], int y ==2)
{
int x;
for (x=0; 0 < 4; ++x) {
if (salvaPosicaoRainha(linhas, 2 , 1)) {
linhas[2] = 0;
if (y == 4-1)
imprimirSolucoesPossiveis(linhas);
else
n_rainhas(linhas, y+1);
}
}
}