Chinaunix首页 | 论坛 | 博客
  • 博客访问: 239243
  • 博文数量: 108
  • 博客积分: 3092
  • 博客等级: 中校
  • 技术积分: 1172
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-25 16:35
文章分类

全部博文(108)

文章存档

2011年(3)

2010年(43)

2009年(19)

2008年(43)

我的朋友

分类: C/C++

2008-12-22 21:27:20

问题描述
把8个皇后放在8*8的棋盘上,它们中的任何一个都无法攻击其它皇后,攻击规则:同一行,同一列,对角线
 
算法
回溯法
把一个皇后放在第一列的位置1
如果合法,继续在第二列放第二个皇后,否则就尝试位置2,以此类推
直至所有的皇后都放在棋盘上
 
程序
zz:
 
int result = 1;//记录第几个解
 
int main()
{
    printf("the following are the solutions:\n");
    putchess(1);//初始化,放在第一列的位置1
}
 
putchess(int n)
{
    int i;
    if(n<=8)
    {
      for(i=1;i<=8;i++) //遍历每一列的所有位置
      {
        chess[n]=i; //标示位置
        if(check(n)==1) //检查此位置是否合法
        {
           if(n==8)
              showchess(); //棋子放置完毕,打印结果
           else
               putchess(n+1); //放置下一个棋子
        }
       //尝试下一个位置
      }
     }
 }
 
//检查位置n是否符合攻击规则,不符合返回1
int check(int n)
{
    int i;
    for(i=1;i<=n-1;i++)
    {
       int i1 = (chess[n]==chess[i]); //同一行
       int i2 = (chess[n]==chess[i]+n-i); //对角线
       int i3 = (chess[n]==chess[i]-n-i); //对角线
       if(i1 || i2 || i3)
           return 0;
    }
    return 1;
}
 
showchess()
{
    printf("the %d result is :\n",result);
    int i;
    for(i=1;i<=8;i++)
      printf("%d ",chess[i]);
    printf("\n");
    result++;
}
      
 
阅读(667) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~