您的位置:首页 > 其它

实现n皇后问题(回溯法)

2013-11-29 14:20 399 查看
/*========================================
功能:实现n皇后问题,这里实现4皇后问题
算法:回溯法
==========================================*/
#include <stdio.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0
#define NUM_QUEEN    4                    /* 皇后个数 */

typedef int BOOL;

void n_queen(int sol[], int n);
BOOL place(int solution[], int k);
void display();

int solution[NUM_QUEEN + 1] = {0};            /* 皇后问题的解向量 */

void main()
{
n_queen(solution, NUM_QUEEN);
display();
}
/*=================================
功能:找出满足n皇后问题的解向量
输入:皇后个数n
输出:n皇后的解向量sol[]
===================================*/
void n_queen(int sol[], int n)
{
int k = 1;                                    /* 从第一个皇后开始 */
sol[k] = 0;
while(k > 0)
{
sol[k] = sol[k] + 1;
while(sol[k] <= n && !place(sol, k))    /* 如果sol[k]列不满足条件 找下一列 */
sol[k] = sol[k] + 1;
if(sol[k] <= n)                            /* 找到满足条件的列 */
{
if(k == n)
break;                            /* 最后一个皇后处理完 直接退出 */
else
k = k + 1;                        /* 处理下一个皇后 */
}
else                                    /* 判断完该行所有列 没有合适的位置 回溯 */
{
sol[k] = 0;
k = k - 1;
}
}
}
/*==========================================================
功能:判断第k个皇后的位置 是否正确 与前面k - 1个皇后比较
输入:前k - 1个解向量
输出:第k个位置是否正确
============================================================*/
BOOL place(int sol[], int k)
{
int i;

for(i = 1; i < k; i ++)
{
if(sol[i] == sol[k] || abs(sol[i] - sol[k]) == abs(i - k))
return FALSE;
}

return TRUE;
}
/*===========================
功能:显示n皇后的解决向量
输入:无
输出:n皇后解决向量
=============================*/
void display()
{
int i = 1;
printf("%d QUEES solution:", NUM_QUEEN);
for(; i <= NUM_QUEEN; i ++)
{
printf("%d\t", solution[i]);
}
printf("\n");
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: