八皇后 #include<stdio.h> #include<math.h> //计算共有多少种可行方法 int count = 0; const int max = 8; //定义一个一维数组棋盘 //由于八皇后问题的条件限制----任意两个皇后不能同行 //所以我们可使用一个8位一维数组表示棋盘 //一维数组的第n个元素即代表第n-1(从第0行开始)行,第n个元素的值即代表第n行的列值 int chessBoard[max]; //int *chessBoard[]; /*判断其他方位是否有棋*/ int isDanger(int row){ //由于C语言没有boolean类型,所以1代表true,0代表false //只需要判断前面几行是否有棋 for(int i = 0; i < row; i++){ //因一维数组的值即代表所在行的所在列值,所以如果值相同,则代表在同一列 //n-i表示两个皇后相差几行,array[n]-array[i]表示相差几列,如果相差行等于相差,则这两个皇后能构成一个正方形,即在同一斜线上。 if(chessBoard[i] == chessBoard[row] || abs(row-i) == abs(chessBoard[row]-chessBoard[i])) return 0; } return 1; } void print(int chessBoard[]){ for (int i = 0; i < max; i++) { printf(chessBoard[i]+" "); } count ++ ; printf("\n"); } /*放置棋子*/ void playChess(int row){ //如果已经走到棋盘最后一行 if(row == max){ print(chessBoard); return; } //表示从第0行的第0列开始放第一个皇后,一直到第0行的第7列遍历出所有第0行的皇后摆放方法.以此类推。 for(int i = 0; i < max; i++){ chessBoard[row] = i; if(isDanger(row) == 1) //如果所在的行没有危险,则递归调用进入棋盘下一行 playChess(row+1); } } void main(){ //从第一行开始下棋 playChess(0); printf("共有%d种方法",count); }