版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a1135004584/article/details/79435341
1.摘要:
-
八皇后问题
思路:通过思考发现每一行的搜索是否安全、将其置1是重复的,变化的是行数,因此可以构造一个递归函数来解决问题。
2.运行结果:
3.代码:
main7.c
#include <stdio.h> int isSafe(int (*chess)[8],int i,int j); void eightQueen(int row,int col,int (*chess)[8]); static int count = 0; int main(void) { int chess[8][8] = {0}; eightQueen(0,8,chess); printf("一共有种%d可能\n",count); return 0; } void eightQueen(int row,int n,int (*chess)[8]) { int i,j; int chess2[8][8]; for(i=0;i<8;i++) { for(j=0;j<8;j++) { chess2[i][j] = chess[i][j]; } } if(8 == row) { for(i=0;i<8;i++) { for(j=0;j<8;j++) printf("%d ",chess2[i][j]); printf("\n"); } printf("\n"); count++; }else{ for(i=0;i<n;i++) { for(j=0;j<n;j++) chess2[row][j]=0; if(isSafe(chess2,row,i)) { chess2[row][i] = 1; eightQueen(row+1,n,chess2); } } } } /** * 该点上下、左右、对角线是否已经有皇后 * @param chess * @param i 行 * @param j 列 * @return */ int isSafe(int (*chess)[8],int i,int j) { int m,n; for(m=0;m<8;m++) //上下 if(chess[m][j]) return 0; for(m=i,n=j;m>=0 && n>=0;m--,n--) //左上角 if(chess[m][n]) return 0; for(m=i,n=j;m<8 && n<8;m++,n++) //右下角 if(chess[m][n]) return 0; for(m=i,n=j;n>=0 && m<8;m++,n--) //右上角 if(chess[m][n]) return 0; for(m=i,n=j;m>=0 && n<8;n++,m--) //左下角 if(chess[m][n]) return 0; return 1; }