博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
国际象棋“皇后”问题的回溯算法
阅读量:4189 次
发布时间:2019-05-26

本文共 2868 字,大约阅读时间需要 9 分钟。

//
国际象棋“皇后”问题处理头文件
//
国际象棋“皇后”问题的回溯算法
/*
    作者:成晓旭
    时间: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

你可能感兴趣的文章
ECOIII專欄,第3集
查看>>
ECO技術和高雄/台中ECO/AJAX技術研討會
查看>>
BDS 2006 Hotfix 4铪铪铪铪铪
查看>>
如何重覆使用ECO建立的企業邏輯模型
查看>>
焦油坑与激情
查看>>
项目开发经验谈(二)
查看>>
项目开发经验谈(一)
查看>>
浅谈项目感觉
查看>>
用积木搭出的埃菲尔铁塔
查看>>
IT项目经理是否需要技术能力
查看>>
饮水者才能自知冷暖
查看>>
产品和样品
查看>>
测试Windows Sockets协议
查看>>
浅谈流媒体测试
查看>>
在接口后面能不能使用new操作符
查看>>
Windows API一日一练(37)MoveWindow函数
查看>>
C/C++内存问题检查利器—Purify (三)
查看>>
C/C++内存问题检查利器—Purify (二)
查看>>
让自定义的类型可以和任意的类型之间转换
查看>>
你讨厌 C++中的“
查看>>