n皇后问题(C语言 回溯算法)
Posted 全栈CV攻城狮
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了n皇后问题(C语言 回溯算法)相关的知识,希望对你有一定的参考价值。
说明:N皇后问题是在n行n列的棋盘上放置N个皇后,使得皇后彼此之间不受攻击,其规则是任意两个皇后不在同一行,同一列和相同的对角线上
。
算法思路
:第i个皇后放在第i行,从第一个皇后开始,对每个皇后从其对应行(第i个皇后对应第i行)的第一个位置开始尝试放置位置,如可以放置,确定该位置,考虑下一个皇后;若于之前皇后有冲突,则考虑下一列;若超出最后一列,则重新确定上一个皇后的位置。重复该过程,知道找到所有的解决方案。
下面是算法的C语言实现
(1)常量和变量说明
pos
:一维数组,pos[i]表示第i个皇后放置在第i行的具体位置
count
:统计放置方案数
i,j,k
:变量
N
:皇后数
(2)C程序如下
#include <stdio.h>
#include <math.h>
#define N 4
//判断第k个皇后目前的放置位置与之前的皇后是否有冲突
int isplace(int pos[],int k)
int i;
for(i=1;i<k;i++)
//分别为判断是否在同一列,是否在对对角线
if(pos[i] == pos[k] || fabs(i-k) == fabs(pos[i] - pos[k]))
return 0;
return 1;
int main()
int i,j,count=1;
int pos[N+1];
for(i=1;i<=N;i++)
pos[i] = 0;
j = 1; //从第一皇后开始
while(j>=1)
pos[j] = pos[j]+1;
//尝试摆放第一个皇后
while(pos[j]<=N && !isplace(pos,j))
pos[j] = pos[j]+1;
//得到第一个摆放方案
if(pos[j]<=N && j == N)
printf("方案%d: ",count++);
for(i=1;i<=N;i++)
printf("%d ",pos[i]);
printf("\\n");
//考虑下一个皇后
if(pos[j]<=N && j<N)
j = j+1;
else //返回考虑上一个皇后
pos[j] = 0;
j--;
return 0;
执行结果:
方案一:2 4 1 3
方案二:3 1 4 2
以上是关于n皇后问题(C语言 回溯算法)的主要内容,如果未能解决你的问题,请参考以下文章