听了下别人的讲解后,最后仔细理解了下所谓的八皇后问题。
怎么说呢,感觉有点像搜索的做法。
#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); }
原文地址:http://blog.csdn.net/acmer_hades/article/details/43938115