正文

回溯法解决N皇后问题2006-06-22 12:37:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/argol/16112.html

分享到:

#include <iostream>using namespace std; #define N 4 char board[N][N];int col[N];               //存储第i行对应的列的值,这样的(i,j)值满足当前棋盘上的皇后不能互相攻击。 bool safetyPlace(int x,int y)  //(x,y)位置是否安全{     for (int i = 0; i < x; i++)     {         int j = col[i];                  if (x == i || y == j)return false;     //同一行或同一列                  if (x-y == i-j || x+y == i+j)return false;  //左,右对角线     }     return true;} void queen(int i)    //处在第i行时状态{     if (i == N)           //输出棋盘       {for (int w = 0;w < N; w++)           {              cout << "--------------" << endl;              for (int j = 0; j < N; j++)                cout << '|' << " " << board[w][j];              cout << '|' << endl;           }        cout << endl;      }     else     {         int u;         for (u = 0; u < N; u++)         {            if (safetyPlace(i,u) == true)           {               col[i] = u;           //记录下第i行可行的列的位置                     arr[i][u] = 'Q';    //放置皇后               queen(i+1);    //转换到下一个状态,即下一行               col[i] = 0;        //回溯到当前状态,重置列和棋盘的值               board[i][u] = 0;           }         }     }}int main(){    queen(0);    system("pause");    return 0;}    不足之处多多指教。:)   解决了N皇后问题,又想了想, 原来树的前序,后序,中序递归遍历也是回溯法的应用。恩,确实让人觉得很 兴奋。对于回溯法的理解,让我一下子觉得豁然开朗了,迷宫,马踏棋盘等等,都可以试着去解决了。。。 以前虽然写过迷宫,用的也是回溯法,只不过不是递归法,方法现在觉得好不流畅。。。看来,还是递归让人觉得 舒服,代码易懂。。

阅读(6155) | 评论(4)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册