Код: Выделить всё
#include <stdio.h>
#include <string.h>
int row[8], col[8], diag1[15], diag2[15];
void print(){
int x,y;
for(y=0;y<8;y++) {
for(x=0;x<8;x++) {
printf(" %c",row[y]==x?'*':'.');
}
putchar('\n');
}
putchar('\n');
}
void try(int y){
int x;
for(x=0;x<8;x++) {
if(col[x] || diag1[x+y] || diag2[x-y+7])
continue;
row[y]=x; col[x]++; diag1[x+y]++; diag2[x-y+7]++;
if(y==7)
print();
else
try(y+1);
row[y]=0; col[x]--; diag1[x+y]--; diag2[x-y+7]--;
}
}
main(){
memset(row,0,sizeof(row));
memset(col,0,sizeof(col));
memset(diag1,0,sizeof(diag1));
memset(diag2,0,sizeof(diag2));
try(0);
return 0;
}
передачу y+1 я организовал так:
Код: Выделить всё
int a[100], sp=0;
#define x a[sp] // это после объявления print() и до конца текста, так что это окей
#define y a[sp+1]
...
if(y==7) print();
else {
sp+=2; y=a[sp-1]+1; try(); sp-=2;
}
, а дальше затрудняюсь... может, сначала надо хвостовую рекурсию сделать, т.е. чтобы try вызывалось в конце try, а там просто for(;;){...}?