听了下别人的讲解后,最后仔细理解了下所谓的八皇后问题。
怎么说呢,感觉有点像搜索的做法。
#include<stdio.h>
int count=0;
//row行,j列;
int notDanger(int row,int j,int (*chess)[8]){
int i,k,flag1=0,flag2=0,flag3=0,flag4=0,flag5=0;
//注意这里row与j不能直接使用;
//判断列的方向有无危险;
for(i=0;i<8;i++){
if(*(*(chess+i)+j)){
flag1=1; break;
}
}
//判断左上方;
for(i=row,k=j;i>=0 && k>=0;i--,k--){
if(*(*(chess+i)+k)){
flag2=1; break;
}
}
// 判断右下方;
for(i=row,k=j;i<8 && k<8;i++,k++){
if(*(*(chess+i)+k)){
flag3=1; break;
}
}
//判断右上方;
for(i=row,k=j;i>=0 && k<8;i--,k++){
if(*(*(chess+i)+k)){
flag4=1; break;
}
}
//判断左下方;
for(i=row,k=j;i<8 && k>=0;i++,k--){
if(*(*(chess+i)+k)){
flag5=1; break;
}
}
//如果其中一个为真的话,那么就返回假;
if(flag1 || flag2 || flag3 || flag4 || flag5 ){
return 0;
}
else return 1;
}
//参数row表示起始行;
void EightQueen(int row, int n, int (*chess)[8]){
int chess2[8][8],i,j;
for(i=0;i<8;i++)
for(j=0;j<8;j++)
chess2[i][j]=chess[i][j];
//递归的结束条件,那么就输出;
if(row==8){
printf("第%d种\n",count+1);
for(i=0;i<8;i++){
for(j=0;j<8;j++)
printf("%d ",*(*(chess2+i)+j));
printf("\n");
}
printf("\n");
count++;
}
else{
//一次调用完以后,根据j的变化来进行下一次的变化;
for(j=0;j<n;j++){ //这里的j代表的是列的意思;
if( notDanger(row,j,chess) ) {//判断是否危险;
for(i=0;i<8;i++){
//先全部清零;
*(*(chess2+row)+i)=0;
}
*(*(chess2+row)+j)=1;
EightQueen(row+1,n,chess2);
}
}
}
}
int main(){
int chess[8][8],i,j;
for(i=0; i<8; i++){
for(j=0; j<8; j++)
chess[i][j]=0;
}
EightQueen(0,8,chess);
printf("有%d种方法",count);
}