 //国际象棋“皇后”问题处理头文件
//国际象棋“皇后”问题处理头文件 //国际象棋“皇后”问题的回溯算法
//国际象棋“皇后”问题的回溯算法 /*
/* 作者:成晓旭
    作者:成晓旭 时间:2001年10月9日(17:35:38-18:00:00)
    时间:2001年10月9日(17:35:38-18:00:00) 内容:完成“皇后”问题的程序序言部分
    内容:完成“皇后”问题的程序序言部分 时间:2001年10月9日(14:00:00-15:00:00)
    时间:2001年10月9日(14:00:00-15:00:00) 内容:完成“皇后”问题的程序序言部分
    内容:完成“皇后”问题的程序序言部分 ===================================================
    =================================================== 问题描述:
    问题描述: 在一个n*n的棋盘上放置n个不能互相捕捉的国际象棋“皇后”,
        在一个n*n的棋盘上放置n个不能互相捕捉的国际象棋“皇后”, 并输出所有合理的布局情况.(在国际象棋中,皇后可以沿着纵、横
    并输出所有合理的布局情况.(在国际象棋中,皇后可以沿着纵、横 及两条斜线共4个方向捕捉对手,可见,合适的解是在每行、每列及
    及两条斜线共4个方向捕捉对手,可见,合适的解是在每行、每列及 在一条斜线上只能有一个皇后<皇后相互捕捉>)
    在一条斜线上只能有一个皇后<皇后相互捕捉>) 编程思想:
    编程思想: 算法描述:
    算法描述: {
    { 输入棋盘大小值n;
        输入棋盘大小值n; m=0;    //从空配置开始
        m=0;    //从空配置开始 notcatch=1;        //空配置中皇后不能相互捕捉
        notcatch=1;        //空配置中皇后不能相互捕捉 do
        do {
        { if(notcatch)
            if(notcatch) {
            { if(m==n)
                if(m==n) {
                { 输出解;
                    输出解; 调整(形成下一个候选解);
                    调整(形成下一个候选解); }
                } else
                else 扩展当前候选解至下一列;    //向前试探
                    扩展当前候选解至下一列;    //向前试探 }
            } else
            else 调整(形成下一个候选解);        //向后回溯
                调整(形成下一个候选解);        //向后回溯 notcatch = 检查当前候选解的合理性
            notcatch = 检查当前候选解的合理性 }while(m!=0)
        }while(m!=0) }
    } */
*/ #include "stdlib.h"
#include "stdlib.h" #define  MAXN 100
#define  MAXN 100 //全局变量及全局工作数组定义
//全局变量及全局工作数组定义 int m,n,NotCatch;
int m,n,NotCatch; int    ColFlag[MAXN+1];    /*表示第i列的第ColFlag[i]行有皇后,(1:有;0:没有)*/
int    ColFlag[MAXN+1];    /*表示第i列的第ColFlag[i]行有皇后,(1:有;0:没有)*/ int RowFlag[MAXN+1];    /*RowFlag[i]:表示第i行没有皇后(1:没有;0:有)*/
int RowFlag[MAXN+1];    /*RowFlag[i]:表示第i行没有皇后(1:没有;0:有)*/ int upBiasFlag[2*MAXN+1];    /*upBiasFlag[i]:表示第i条上斜线(右高左斜)没有皇后(1:没有;0:有)*/
int upBiasFlag[2*MAXN+1];    /*upBiasFlag[i]:表示第i条上斜线(右高左斜)没有皇后(1:没有;0:有)*/ int dnBiasFlag[2*MAXN+1];    /*dnBiasFlag[i]:表示第i条下斜线(左高右斜)没有皇后(1:没有;0:有)*/
int dnBiasFlag[2*MAXN+1];    /*dnBiasFlag[i]:表示第i条下斜线(左高右斜)没有皇后(1:没有;0:有)*/ //显示输入填写的数字
//显示输入填写的数字 void ArrangeQueen()
void ArrangeQueen() {
{ int i;
    int i; char answer;
    char answer; printf("输入棋盘边格数:");
    printf("输入棋盘边格数:"); scanf("%d",&n);
    scanf("%d",&n); for(i=0;i<=n;i++)    /*设置程序初始状态*/
    for(i=0;i<=n;i++)    /*设置程序初始状态*/ ColFlag[i] = 1;
        ColFlag[i] = 1; for(i=0;i<=2*n;i++)
    for(i=0;i<=2*n;i++) upBiasFlag[i] = dnBiasFlag[i] = 1;
        upBiasFlag[i] = dnBiasFlag[i] = 1; m = 1;
    m = 1; ColFlag[1] = 1;
    ColFlag[1] = 1; NotCatch = 1;
    NotCatch = 1; ColFlag[0] = 0;
    ColFlag[0] = 0; do
    do {
    { if(NotCatch)
        if(NotCatch) {
        { if(m==n)
            if(m==n) {
            { printf("列	行");
                printf("列	行"); for(i=1;i<=n;i++)    /*找到可行解,输出*/
                for(i=1;i<=n;i++)    /*找到可行解,输出*/ printf("%3d	%3d ",i,ColFlag[i]);
                    printf("%3d	%3d ",i,ColFlag[i]); printf("还要继续搜索吗(Q/q for Exit)? ");
                printf("还要继续搜索吗(Q/q for Exit)? "); scanf("%c",&answer);
                scanf("%c",&answer); if(answer=='Q' || answer=='q')
                if(answer=='Q' || answer=='q') exit(0);
                    exit(0); while(ColFlag[m] == n)
                while(ColFlag[m] == n) {
                { m--;    /*清除第m-1列,第RowFlag[ColFlag[m-1]]行有皇后的标志*/
                    m--;    /*清除第m-1列,第RowFlag[ColFlag[m-1]]行有皇后的标志*/ RowFlag[ColFlag[m]] = upBiasFlag[m+ColFlag[m]] = dnBiasFlag[n+m-ColFlag[m]] = 1;
                    RowFlag[ColFlag[m]] = upBiasFlag[m+ColFlag[m]] = dnBiasFlag[n+m-ColFlag[m]] = 1; }
                } ColFlag[m]++;    /*调整第m列的皇后配置(扩展调整)*/
                ColFlag[m]++;    /*调整第m列的皇后配置(扩展调整)*/ }
            } else
            else {
            { /*设置第m列,第RowFlag[ColFlag[m-1]]行有皇后的标志*/
                /*设置第m列,第RowFlag[ColFlag[m-1]]行有皇后的标志*/ RowFlag[ColFlag[m]] = upBiasFlag[m+ColFlag[m]] = dnBiasFlag[n+m-ColFlag[m]] = 0;
                RowFlag[ColFlag[m]] = upBiasFlag[m+ColFlag[m]] = dnBiasFlag[n+m-ColFlag[m]] = 0; ColFlag[++m] = 1;    /*向前试探*/
                ColFlag[++m] = 1;    /*向前试探*/ }
            } }
        } else
        else {
        {     while(ColFlag[m]==n)    /*向后回溯*/
            while(ColFlag[m]==n)    /*向后回溯*/ {
            { m--;    /*清除第m-1列,第RowFlag[ColFlag[m-1]]行有皇后的标志*/
                m--;    /*清除第m-1列,第RowFlag[ColFlag[m-1]]行有皇后的标志*/ RowFlag[ColFlag[m]] = upBiasFlag[m+ColFlag[m]] = dnBiasFlag[n+m-ColFlag[m]] = 1;
                RowFlag[ColFlag[m]] = upBiasFlag[m+ColFlag[m]] = dnBiasFlag[n+m-ColFlag[m]] = 1; }
            } ColFlag[m]++;    /*调整第m列的皇后配置(回溯调整)*/
            ColFlag[m]++;    /*调整第m列的皇后配置(回溯调整)*/ }
        } NotCatch = RowFlag[ColFlag[m]] && upBiasFlag[m+ColFlag[m]] && dnBiasFlag[n+m-ColFlag[m]];
        NotCatch = RowFlag[ColFlag[m]] && upBiasFlag[m+ColFlag[m]] && dnBiasFlag[n+m-ColFlag[m]]; }while(m!=0);
    }while(m!=0); }
}
 void dArrange_Queen_All(int k,int n)
void dArrange_Queen_All(int k,int n) {
{ int i,j;
    int i,j; char answer;
    char answer; for(i=1;i<=n;i++)
    for(i=1;i<=n;i++) {
    { if(RowFlag[i] && upBiasFlag[k+i] && dnBiasFlag[n+k-i])
        if(RowFlag[i] && upBiasFlag[k+i] && dnBiasFlag[n+k-i]) {
        { ColFlag[k] = i;
            ColFlag[k] = i; RowFlag[i] = upBiasFlag[k+i] = dnBiasFlag[n+k-i] = 0;
            RowFlag[i] = upBiasFlag[k+i] = dnBiasFlag[n+k-i] = 0; if(k==0)
            if(k==0) {
            { printf("列	行");
                printf("列	行"); for(j=1;j<=n;j++)    /*找到可行解,输出*/
                for(j=1;j<=n;j++)    /*找到可行解,输出*/ printf("%3d	%3d ",i,ColFlag[i]);
                    printf("%3d	%3d ",i,ColFlag[i]); printf("还要继续搜索吗(Q/q for Exit)? ");
                printf("还要继续搜索吗(Q/q for Exit)? "); scanf("%c",&answer);
                scanf("%c",&answer); if(answer=='Q' || answer=='q')
                if(answer=='Q' || answer=='q') exit(0);
                    exit(0); }
            } else
            else dArrange_Queen_All(k+1,n);
                dArrange_Queen_All(k+1,n); RowFlag[i] = upBiasFlag[k+i] = dnBiasFlag[n+k-i] = 1;
            RowFlag[i] = upBiasFlag[k+i] = dnBiasFlag[n+k-i] = 1; }
        } }
    } }
} void dArrangeQueenAll()
void dArrangeQueenAll() {
{ int i;
    int i; printf("输入棋盘边格数:");
    printf("输入棋盘边格数:"); scanf("%d",&n);
    scanf("%d",&n); for(i=0;i<=n;i++)    /*设置程序初始状态*/
    for(i=0;i<=n;i++)    /*设置程序初始状态*/ ColFlag[i] = 1;
        ColFlag[i] = 1; for(i=0;i<=2*n;i++)
    for(i=0;i<=2*n;i++) upBiasFlag[i] = dnBiasFlag[i] = 1;
        upBiasFlag[i] = dnBiasFlag[i] = 1; dArrange_Queen_All(1,n);
    dArrange_Queen_All(1,n); }
}Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=935666
 
                    
                     
                    
                 
                    
                 
        
 
     
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号