#include<stdio.h>
void getEightQueen(int index);
bool checkPosLegal(int index, int loop);
void show();
int ansArray[8] = { 0 };
int ansNum = 0;
int main(){
getEightQueen(0);
printf("共有%d种", ansNum);
return 1;
}
void getEightQueen(int index){
//将if单拎出来
if (index == 8){
ansNum++, show();
return;
}
for (int loop = 0; loop<8; loop++){
if (checkPosLegal(index, loop)){
ansArray[index] = loop; //递归的接口 不能停
getEightQueen(index + 1);
}
}
}
bool checkPosLegal(int index, int loop){
for (int i = 0; i<index; i++){
if (ansArray[i] == loop)
return false;
if (ansArray[i] + i == index + loop)
return false;
if (ansArray[i] - i == loop - index)
return false;
}
return true;
}
void show(){
for (int i = 0; i<8; i++){
for (int j = 0; j<ansArray[i]; j++)
printf("* ");
printf("# ");
for (int j = ansArray[i] + 1; j<8; j++)
printf("* ");
printf("\n");
}
printf("\n");
}
getEightQueen(0);
printf("共有%d种", ansNum);
return 1;
}
void getEightQueen(int index){
//将if单拎出来
if (index == 8){
ansNum++, show();
return;
}
for (int loop = 0; loop<8; loop++){
if (checkPosLegal(index, loop)){
ansArray[index] = loop; //递归的接口 不能停
getEightQueen(index + 1);
}
}
}
bool checkPosLegal(int index, int loop){
for (int i = 0; i<index; i++){
if (ansArray[i] == loop)
return false;
if (ansArray[i] + i == index + loop)
return false;
if (ansArray[i] - i == loop - index)
return false;
}
return true;
}
void show(){
for (int i = 0; i<8; i++){
for (int j = 0; j<ansArray[i]; j++)
printf("* ");
printf("# ");
for (int j = ansArray[i] + 1; j<8; j++)
printf("* ");
printf("\n");
}
printf("\n");
}
总结:通过在函数里面递归,再通过return返回 形成回溯遍历