登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

pipi的小窝

 
 
 

日志

 
 

八皇后问题(回溯法)  

2011-02-20 03:25:32|  分类: 算法 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

                     八皇后问题实现

哈哈,经典的回溯法问题,以前都是看别人写,今天自己写了下,呼呼

算法回溯部分

将尝试移动第7列的另外一点,以为第8个皇后在第八列寻找一个合适的位置.

如果第7个列找不到合适的位置而无法移动,那么算法就必须去掉它然后回溯到第6列的皇后

最终算法不断重复着摆放皇后和回溯的过程直找到问题为止

 

八皇后问题(回溯法) - pipi - 半瓶子水(pipi)

 

C++语言: Codee#16944
#include <iostream>
#include<conio.h>

using namespace std;

//用queens[]数组储存每个皇后的位置

#define  Max 8
int sum = 0;

class QueenPuzzle
{

    int queens[Max];
public:
    void printout();
    int  IsVaild(int n);//判断第n个皇后放上去以后,是否合法
    void PlaceQueen(int i);
};

void QueenPuzzle::printout()
{
for (int i=0;i<Max;i++)
{
     for (int j=0;j<Max;j++)
     {
         if (j==queens[i])
             cout<<"■";
         else
             cout<<"□";

     }
     cout<<endl;

}

    cout<<"按q键退出,按其他键继续"<<endl<<endl;
     if(getch()=='q')
         exit(0);

}

void QueenPuzzle::PlaceQueen(int i)
{

    for(int j=0;j<Max;j++)
        //如果全部放完输出结果;
    {
        if (i==Max)
        {
            sum++;
            cout<<"第"<<sum<<"组解"<<endl;
            printout();
            return;
        }

        //放置皇后
        queens[i] = j;
       //判断下一位置能放皇后不
        if (IsVaild(i))
        {
            PlaceQueen(i+1);
        }
   
    }
}

//判断皇后放上去是否合法,是否无冲突
int QueenPuzzle::IsVaild(int n)
{
  //将第n个皇后与第n+1个皇后进行比较
   for (int i=0;i<n;i++)
   {
     if (queens[i]==queens[n])
         return 0;
     if(abs(queens[i]-queens[n])==(n-i))
         return 0;

   }

   return 1;
 
}

int  main()
{
QueenPuzzle queen;
queen.PlaceQueen(0);
cout<<"共有"<<sum<<"组解"<<endl;

    return 0;
}
  

递归可以说是一把双刃剑,正确使用运用递归能够写出逻辑清晰,可读性强的代码.
  评论这张
 
阅读(2558)| 评论(1)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018