大家好,我是贤弟!
一、什么是N皇后问题?
N皇后问题是一个经典的计算机科学问题,它的目标是在NxN的棋盘上放置N个皇后,使得这些皇后相互之间无法攻击对方。
按照国际象棋的规则,皇后可以攻击与之处在同一行、同一列或同一斜线上的棋子。
因此,在棋盘上放置皇后时需要考虑这些限制条件,使得每个皇后所在的行、列、斜线都没有其他皇后存在。
求解N皇后问题的原理是穷举法,通过递归的方式从第一行开始,尝试将皇后放置到每一列中,并判断是否符合要求,如果符合则进入下一行进行操作,如果不符合则回溯到上一行重新选择位置。通过反复尝试所有的可能性,直到找到所有合法的解决方案。
二、用C语言实现N皇后问题
#include#include int Place(int (*arr)[20], int row, int col, int n) // 判断在此列是否能放置皇后{ for(int i = 0; i < row; i++) { if(arr[i][col] == 1) // 判断在此列上是否已经有其他皇后了 return 0; if(row - i >= 1 && col - i >= 1) if(arr[row - i - 1][col - i - 1] == 1) // 判断左上角斜线上是否已经有其他皇后 return 0; if(row - i >= 1 && col + i < n) if(arr[row - i - 1][col + i] == 1) // 判断右上角斜线上是否已经有其他皇后 return 0; } return 1;} void Print(int (*arr)[20], int n) // 打印结果{ static int num = 1; printf("Result %d: \n", num++); for(int i = 0; i < n; i++) { for(int j = 0; j < n; j++) printf("%d ", arr[i][j]); printf("\n"); }} void Queen(int (*arr)[20], int row, int n) // 求解 N 皇后问题{ if(row == n) { Print(arr, n); return; } for(int i = 0; i < n; i++) { if(Place(arr, row, i, n)) { arr[row][i] = 1; // 标记当前位置可以放置皇后 Queen(arr, row + 1, n); // 继续放置下一行皇后 arr[row][i] = 0; // 取消当前位的标记,回溯到上一行的状态 } }} int main(){ int n; printf("Please enter a number: "); scanf("%d", &n); int arr[20][20] = {0}; Queen(arr, 0, n); return 0;}
领取专属 10元无门槛券
私享最新 技术干货