用户操作
[即时聊天] [发私信] [加为好友]
心淡
最近评论
xieqiao_xia:悄悄路过!!!洒泡尿尿~~~
文章分类
    收藏
      相册
      风景
      存档
      软件项目交易
      订阅我的博客
      XML聚合  FeedSky
      订阅到鲜果
      订阅到Google
      订阅到抓虾
      订阅到BlogLines
      订阅到Yahoo
      订阅到GouGou
      订阅到飞鸽
      订阅到Rojo
      订阅到newsgator
      订阅到netvibes

      原创 求解八皇后问题收藏

      新一篇: 关于几个常用容器类型的比较 | 旧一篇: 惊叹!---就算大自然的鬼斧神功也造就不出如此的代码

      八皇后问题的解法

               八皇后问题,是在一个8×8的棋盘上,放上8个皇后,要求在棋盘的行,列,对角线上只能有一个皇后。对这个问题的典型解法是利用回溯算法。即先假设在第一个格子放一个皇后,因为一行一列中只能有一个皇后,所以跳到下一行放置第二个皇后,然后检查该位置放置的皇后是否与之前所置所有皇后冲突,若无冲突,继续执行。若冲突,则选择当前行中其他位置进行放置,若当前行中所有位置都不能满足,则跳到上一行,删除上一行放置的棋子,并将此位置标记为false,然后更换位置。重复做以上方法。当旗子数等于棋盘的行数时,求解完成,打印输出。

      以下是求解八皇后问题的完整代码:

      头文件:

      #include<iostream>

      #include<string>

      using namespace std;

       

      const int max_board=30; //棋盘允许的最大大小

      int sum=0;记录解法总数

       

      class Queens

      {

      public:

             Queens();

             Queens(int size);

             void print() const;

             bool unguarded(int col) const; //判断当前位置是否与其他位置冲突,若冲突,则返回false,否则,返回true

             void insert(int col);  //插入皇后

             void remove(int col);//移除上一行的皇后

             bool is_solved() const;//是否有解?

             int board_size;

      private:

             int count;

             bool queen_square[max_board][max_board];

      };

       

       

      Queens::Queens(int size)

      {

             board_size=size;

             count=0;

             for(int row=0;row<board_size;row++)

                    for(int col=0;col<board_size;col++)

                           queen_square[row][col]=false;

      }

       

      void Queens::insert(int col)

      {

             queen_square[count++][col]=true;

      }

       

      void Queens::remove(int col)

      {

             queen_square[--count][col]=false;

      }

       

      bool Queens::is_solved() const

      {

             return count==board_size;

      }

       

      void Queens::print() const

      {

             sum++;

             cout<<""<<sum<<"种解法"<<endl;

             for(int row=0;row<board_size;row++)

             {

                    for(int col=0;col<board_size;col++)

                    {

                           if(queen_square[row][col]==true)

                                  cout<<"1 ";

                           else

                                  cout<<"0 ";

                    }

                    cout<<endl;   

             }

      }

       

      bool Queens::unguarded(int col)const

      {

             int i;

             bool ok=true;

             for(i=0;ok && i<count;i++)

                    ok=!queen_square[i][col];

             for(i=1;ok && count-i>=0 && col-i>=0;i++)

                    ok=!queen_square[count-i][col-i];

             for(i=1;ok && count-i>=0 && col+i<board_size;i++)

                    ok=!queen_square[count-i][col+i];

             return ok;

      }

       

       

      源文件:

      #include"Queens.h"

      #include<iostream>

       

      using namespace std;

       

      int main()

      {

       

             int board_size;

             void solve_from(Queens &configuration);

             cout<<"What is the size of the board?"<<endl;

       

             cin>>board_size;

             if(board_size<0 || board_size>max_board)

                    cout<<"The number must be between 0 and "<<max_board<<endl;

             else{

                    Queens configuration(board_size);

                    solve_from(configuration);

             }

             if(sum==0)

                    cout<<"无解!"<<endl;

             cin.get();

             cin.get();

             return 0;

       

      }

       

             void solve_from(Queens &configuration)

             {

                    if(configuration.is_solved())

                           configuration.print();

                    else

                    for(int col=0;col<configuration.board_size;col++)

                           if(configuration.unguarded(col))

                           {

                                  configuration.insert(col);

                                  solve_from(configuration);

                                  configuration.remove(col);

                           }

       

             }

       

       

      发表于 @ 2007年10月27日 15:40:00|评论(loading...)|编辑

      新一篇: 关于几个常用容器类型的比较 | 旧一篇: 惊叹!---就算大自然的鬼斧神功也造就不出如此的代码

      评论

      #xieqiao_xia 发表于2008-03-17 20:50:36  IP: 61.128.234.*
      悄悄路过!!!洒泡尿尿~~~
      发表评论  


      当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
      Csdn Blog version 3.1a
      Copyright © 心淡