您的位置:首页 > 其它

国际象棋“皇后”问题的回溯算法

2008-01-03 09:43 399 查看

//国际象棋“皇后”问题处理头文件


//国际象棋“皇后”问题的回溯算法




/**//*


    作者:成晓旭


    时间:2001年10月9日(17:35:38-18:00:00)


    内容:完成“皇后”问题的程序序言部分


    时间:2001年10月9日(14:00:00-15:00:00)


    内容:完成“皇后”问题的程序序言部分


    ===================================================


    问题描述:


        在一个n*n的棋盘上放置n个不能互相捕捉的国际象棋“皇后”,


    并输出所有合理的布局情况.(在国际象棋中,皇后可以沿着纵、横


    及两条斜线共4个方向捕捉对手,可见,合适的解是在每行、每列及


    在一条斜线上只能有一个皇后<皇后相互捕捉>)


    编程思想:


    算法描述:


    {


        输入棋盘大小值n;


        m=0;    //从空配置开始


        notcatch=1;        //空配置中皇后不能相互捕捉


        do


        {


            if(notcatch)


            {


                if(m==n)


                {


                    输出解;


                    调整(形成下一个候选解);


                }


                else


                    扩展当前候选解至下一列;    //向前试探


            }


            else


                调整(形成下一个候选解);        //向后回溯


            notcatch = 检查当前候选解的合理性


        }while(m!=0)


    }


*/


#include "stdlib.h"


#define  MAXN 100


//全局变量及全局工作数组定义


int m,n,NotCatch;




int    ColFlag[MAXN+1];    /**//*表示第i列的第ColFlag[i]行有皇后,(1:有;0:没有)*/




int RowFlag[MAXN+1];    /**//*RowFlag[i]:表示第i行没有皇后(1:没有;0:有)*/




int upBiasFlag[2*MAXN+1];    /**//*upBiasFlag[i]:表示第i条上斜线(右高左斜)没有皇后(1:没有;0:有)*/




int dnBiasFlag[2*MAXN+1];    /**//*dnBiasFlag[i]:表示第i条下斜线(左高右斜)没有皇后(1:没有;0:有)*/


//显示输入填写的数字


void ArrangeQueen()




...{


    int i;


    char answer;


    printf("输入棋盘边格数:");


    scanf("%d",&n);




    for(i=0;i<=n;i++)    /**//*设置程序初始状态*/


        ColFlag[i] = 1;


    for(i=0;i<=2*n;i++)


        upBiasFlag[i] = dnBiasFlag[i] = 1;


    m = 1;


    ColFlag[1] = 1;


    NotCatch = 1;


    ColFlag[0] = 0;


    do




    ...{


        if(NotCatch)




        ...{


            if(m==n)




            ...{


                printf("列 行");




                for(i=1;i<=n;i++)    /**//*找到可行解,输出*/


                    printf("%3d %3d ",i,ColFlag[i]);


                printf("还要继续搜索吗(Q/q for Exit)? ");


                scanf("%c",&answer);


                if(answer=='Q' || answer=='q')


                    exit(0);


                while(ColFlag[m] == n)




                ...{




                    m--;    /**//*清除第m-1列,第RowFlag[ColFlag[m-1]]行有皇后的标志*/


                    RowFlag[ColFlag[m]] = upBiasFlag[m+ColFlag[m]] = dnBiasFlag[n+m-ColFlag[m]] = 1;


                }




                ColFlag[m]++;    /**//*调整第m列的皇后配置(扩展调整)*/


            }


            else




            ...{




                /**//*设置第m列,第RowFlag[ColFlag[m-1]]行有皇后的标志*/


                RowFlag[ColFlag[m]] = upBiasFlag[m+ColFlag[m]] = dnBiasFlag[n+m-ColFlag[m]] = 0;




                ColFlag[++m] = 1;    /**//*向前试探*/


            }


        }


        else




        ...{    




            while(ColFlag[m]==n)    /**//*向后回溯*/




            ...{




                m--;    /**//*清除第m-1列,第RowFlag[ColFlag[m-1]]行有皇后的标志*/


                RowFlag[ColFlag[m]] = upBiasFlag[m+ColFlag[m]] = dnBiasFlag[n+m-ColFlag[m]] = 1;


            }




            ColFlag[m]++;    /**//*调整第m列的皇后配置(回溯调整)*/


        }


        NotCatch = RowFlag[ColFlag[m]] && upBiasFlag[m+ColFlag[m]] && dnBiasFlag[n+m-ColFlag[m]];


    }while(m!=0);


}




void dArrange_Queen_All(int k,int n)




...{


    int i,j;


    char answer;


    for(i=1;i<=n;i++)




    ...{


        if(RowFlag[i] && upBiasFlag[k+i] && dnBiasFlag[n+k-i])




        ...{


            ColFlag[k] = i;


            RowFlag[i] = upBiasFlag[k+i] = dnBiasFlag[n+k-i] = 0;


            if(k==0)




            ...{


                printf("列 行");




                for(j=1;j<=n;j++)    /**//*找到可行解,输出*/


                    printf("%3d %3d ",i,ColFlag[i]);


                printf("还要继续搜索吗(Q/q for Exit)? ");


                scanf("%c",&answer);


                if(answer=='Q' || answer=='q')


                    exit(0);


            }


            else


                dArrange_Queen_All(k+1,n);


            RowFlag[i] = upBiasFlag[k+i] = dnBiasFlag[n+k-i] = 1;


        }


    }


}


void dArrangeQueenAll()




...{


    int i;


    printf("输入棋盘边格数:");


    scanf("%d",&n);




    for(i=0;i<=n;i++)    /**//*设置程序初始状态*/


        ColFlag[i] = 1;


    for(i=0;i<=2*n;i++)


        upBiasFlag[i] = dnBiasFlag[i] = 1;


    dArrange_Queen_All(1,n);


}

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=935666
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: