n后问题
一、 问题描述
- 在n×n格的棋盘上放置彼此不受攻击的n个皇后,按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子,请输出皇后的位置以及对应皇后的解法个数。
分析:
-
理解皇后不被攻击的条件:n后问题等价于在n*n格的棋盘上放置n个皇后,任何两个皇后不能放在同一行或同一列或同一斜线上。
-
算法模块简要分析。
用数组存储皇后的位置,将i设置为0。
Int place(*x,n) :数组x[] 用来表示列数,n为皇后个数,用来判断皇后 否被攻击,判断的条件是(x[i]-x[n]==i-n||x[i]-x[n]==n-i||x[i]==x[n])即用来判断“同一行或同一列或同一斜线上”。
用数组存储皇后的位置,将i设置为0。
Int iniprint(*x,n):初始化打印函数,相当于对棋盘初始化。将可以放皇后的位置记为“1”,不放皇后的位置记为“0”
Int Nqueen(int n):n皇后问题求解,如果满足一组可行解,sum++。Int i=0,如果x[i]>=n的时候即进行下一行,i++;当i=n时,sum++;输出该组可行解的个数和位置的矩阵。并且i–,回溯到上一层继续搜索可行解。
二、 程序实现
#include<stdio.h>
static int n,sum=0;//可行解个数
static int locate[20];
int place(int k)
{
//判断是否在一条线上并返回0,1
for(int i=1;i<k;i++){