回溯算法皇后问题

#include "stdafx.h"
#include<stdio.h>
#include<malloc.h>

typedef enum{TRUE,FALSE}Status; //定义新类型

void OutSolution(int n,int * x) //输出满足情况的皇后分布
{
int static k=0; //用于输出第几种情况
printf("%d:",++k);
for(int i=0;i<n;i++) //输出(i,x[i]),i表示行,x[i]表示列,因为每个皇后各
printf("(%d,%d)",i,x[i]);//占一行
printf("\n");

}
void BackTrack(int i,int n,Status * a,Status * b,Status * c,int * x)
{
if(i>n-1) //n为棋盘行数,只须大于n-1,即已有满足情况的分布出现,
OutSolution(n,x);//i表示行,i>n-1,表示每行都已满足
else
{
for(int j=0;j<n;j++)
if(a[j]==FALSE && b[i+j]==FALSE && c[i-j+n]==FALSE)//若全为FALSE,表示
{ //没有放置皇后
a[j]=TRUE; //表示a[j]放置皇后
b[i+j]=TRUE; //表示a[j]所在的副对角线全部设置成TRUE
c[i-j+n]=TRUE; //表示a[j]所在的主对角线全部设置成TRUE
x[i]=j; //x[i]记录第i行,皇后放置的位置在j列上
BackTrack(i+1,n,a,b,c,x);//递归,一直求满足条件的分布, 首先为i=1,for开始循环,试探0,1,2,3列
a[j]=FALSE; //若满足并假设j=1,则进行i=2,for开始循环,试探0,1,2,3列;
b[i+j]=FALSE; //若不满足,则跳出BakcTrack(),变a[1],b[1+1],c[1-1+n]==FALSE;
c[i-j+n]=FALSE; //然后重新试探i=1时,满足条件的j,直到全部都满足为止
} //全部满足时,i+1>3,则输出
}
}

void Queen(int n)
{
Status * a,* b, * c;
int i,* x;
a=(Status *)malloc(sizeof(Status) * (n));
b=(Status *)malloc(sizeof(Status) * (2*n));
c=(Status *)malloc(sizeof(Status) * (2*n));
x=(int *)malloc(sizeof(int) * (n));

for(i=0;i<n;i++) a[i]=FALSE; //初始化
for(i=0;i<2*n;i++) b[i]=FALSE;
for(i=0;i<2*n;i++) c[i]=FALSE;

BackTrack(0,n,a,b,c,x);
free(a);free(b);free(c);free(x);
}
int _tmain(int argc, _TCHAR* argv[])
{
Queen(4); //设置为4行的棋盘
return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值