C语言 八皇后问题的解决

八皇后的问题描述:

     在 8 X 8 方格的棋盘中 ,每一行 中 有一个皇后旗子, 该旗子的 横、 竖、左倾斜、右倾斜的位置都是不能存在其他的旗子, 问有多少种摆法?

百度百科介绍

解决的思路

   1. 固定到一行,依次选择下一列

   2. 当选择一个位置的时候,需要 判断 该棋子位置的行方向 列方向 对角倾斜的方向 有没有其他的棋子, 如果有,则 换下对应列的位置

解决代码如下

#include <stdio.h>
#include <stdlib.h>

int count = 1;

// 判断当前的位置 是否危险
// 0 是危险
// 1 不危险
// row 是当前的行 y
// column 当前的列 x
int isExistChess(int row, int column, int (*chess)[8]){
  int z;
  int x3 = row, y3 = column;
  int x4 = row, y4 = column;

  // 正上
  for(z = row; z >= 0; z--){
    if(chess[z][column] == 1){
      return 0;
    }
  }

  // 正左
  // for(z = column; z >= 0; z--){
  //   if(chess[row][z] == 1){
  //     return 0;
  //   }
  // }

  // 左上
  while(x3 >= 0 && y3 >= 0){
    if(chess[x3][y3] == 1){
      return 0;
    }
    x3 -= 1;
    y3 -= 1;
  }

  // 右上
  while(x4 >= 0 && y4 < 8){
    if(chess[x4][y4] == 1){
      return 0;
    }
    x4 -= 1;
    y4 += 1;
  }

  return 1;
}

void ChessErgodic(int row, int (*chess)[8]){
  int tmpchess[8][8], x, y;

  for(x = 0; x < 8; x++){
    for(y = 0; y < 8; y++){
      *(*(tmpchess + x) + y) = *(*(chess + x) + y);
    }
  }
  if(8 == row){
    printf("第%d种:\n", count++);
    for(x = 0; x < 8; x++){
      for(y = 0; y < 8; y++){
        printf("%d  ", *(*(tmpchess + x) + y));
      }
      printf("\n");
    }
    printf("\n");
  } else {
    for(y = 0; y < 8; y++){
      for(x = 0; x < 8; x++){
        *(*(tmpchess + row) + x) = 0;
      }
      if(isExistChess(row, y, tmpchess)){
        *(*(tmpchess + row) + y) = 1;
        ChessErgodic(row + 1, tmpchess);
      }
    }
  }
}

int main(int argc, char const *argv[])
{
  int chess[8][8], x, y;

  // 初始化棋盘
  for(x = 0; x < 8; x++){
    for(y = 0; y < 8; y++){
      chess[x][y] = 0;
    }
  }
  ChessErgodic(0, chess);

  return 0;
}

结果:

...

第92种:
0  0  0  0  0  0  0  1  
0  0  0  1  0  0  0  0  
1  0  0  0  0  0  0  0  
0  0  1  0  0  0  0  0  
0  0  0  0  0  1  0  0  
0  1  0  0  0  0  0  0  
0  0  0  0  0  0  1  0  
0  0  0  0  1  0  0  0  

可以看出,总共有 92 中摆放方法 ,高斯先生都算不全的东西,使用编程就能很好的解决

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
皇后问题是经典的递归问题,可以使用回溯法进行求解。下面是使用C语言实现的递归解决皇后问题的代码: ```c #include<stdio.h> #include<stdlib.h> #define N 8 int board[N][N]; // 棋盘 void print_board() // 打印棋盘 { int i, j; for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { printf("%d ", board[i][j]); } printf("\n"); } printf("\n"); } int is_safe(int row, int col) // 判断当前位置是否安全 { int i, j; // 检查行和列 for (i = 0; i < N; i++) { if (board[row][i] || board[i][col]) { return 0; } } // 检查对角线 for (i = row, j = col; i >= 0 && j >= 0; i--, j--) { if (board[i][j]) { return 0; } } for (i = row, j = col; i < N && j >= 0; i++, j--) { if (board[i][j]) { return 0; } } return 1; } int solve(int col) // 递归求解 { if (col == N) { // 找到了一组解 print_board(); return 1; } int i, count = 0; for (i = 0; i < N; i++) { if (is_safe(i, col)) { board[i][col] = 1; count += solve(col + 1); board[i][col] = 0; } } return count; } int main() { int count = solve(0); printf("Total solutions: %d\n", count); return 0; } ``` 上面的代码中,`board`是一个8x8的二维数组,用来表示棋盘。`is_safe`函数用来判断当前位置是否安全,即当前位置是否能放置皇后。`solve`函数是递归求解八皇后问题的核心函数,它从第0列开始,依次尝试在每一行中放置皇后,如果当前位置安全,则将皇后放置在该位置,并递归求解下一列的问题;如果当前位置不安全,则直接返回。当递归到第N列时,表示找到了一组解,输出该解,并返回1。最后在`main`函数中调用`solve`函数,并输出总共找到的解的个数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值