四皇后、八皇后棋盘问题

数据与结构第六章第7节“回溯法与树的遍历”中关于四皇后问题

//四皇后问题,或八皇后问题,即在棋盘上任何两个棋子都不占据棋盘上的同一行、同一列或同一对角线
#include <stdio.h>
#include <stdlib.h>
#define Failed 0
#define Succeed 1
#define SIZE 8  //棋盘大小
typedef int Status;

typedef struct
{
    int r[SIZE+1];
    int num;
}Queen,*QueenP; //棋盘数据结构:r[i]代表第i行,其值表示该行第几列有棋子

void Trial(QueenP Q,int n,int i);
void Print(QueenP Q);
Status Judge(QueenP Q);
int main()
{
    QueenP Q;
    Q=(QueenP)malloc(sizeof(Queen));
    Q->num=0;
    Trial(Q,SIZE,1);
    return 0;
}
//四皇后棋盘:在n*n的棋盘第i行上放置棋子,算法从i=1开始,到i=n时结束
void Trial(QueenP Q,int n,int i)
{
    if(i>n)
        Print(Q);
    else
    {
        int j;
        for(j=1;j<=n;j++)
        {
            Q->num=i;
			Q->r[i]=j;   //在棋盘第i行第j列位置放置棋子
            if(Judge(Q))  //如果当前放置符合要求,则继续往下一行放置
                Trial(Q,n,i+1);
        }
    }
}
//---打印棋盘
void Print(QueenP Q)
{
    int i;
    printf("\n");
    for(i=1;i<=Q->num;i++)
        printf(" %d ",Q->r[i]);
    printf("\n");
}
//---判断当前棋盘是否符合约束条件
Status Judge(QueenP Q)
{
    int i;
	if(Q->num<2)    //如果只有一个棋子,则肯定是符合的
		return Succeed;
    for(i=1;i<Q->num;i++)
    {
        int j;
        for(j=i+1;j<=Q->num;j++)
            if(Q->r[i]==Q->r[j])   //如果两个棋子同一列,则不符合
                return Failed;
        if(Q->r[i]==Q->r[i+1]-1 || Q->r[i]==Q->r[i+1]+1 ) //如果棋子和下一个棋子在对角线上,则不符合
            return Failed;
    }
    return Succeed;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值