首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

请问:回溯法解n后有关问题,能否得到并输出所有解序列

2012-02-14 
请教:回溯法解n后问题,能否得到并输出所有解序列?代码:publicclassQueen{publicvoidQueen(intn){nnQ.sum

请教:回溯法解n后问题,能否得到并输出所有解序列?
代码:
  public   class   Queen
        {

                public   void   Queen(int   n)
                {
                        n   =   n;
                        Q.sum   =   0;
                        int*   p   =   new   int[n+1];
                        for   (int   i   =   0;   i   <=   n;   i++)
                                p[i]   =   0;
                        Q.x   =   p;
                }
                private   bool   Place(int   k)
                {
                        for   (int   j   =   1;   j   <   k;   j++)
                                if   ((Math.Abs(k   -   j)   ==   Math.Abs(x[j]   -   x[k]))   |   (x[j]   ==   x[k]))   return   false;
                        return   true;
                }


                public   void   Backtrack(int   t)
                {
                        if   (t   >   n)   sum++;
                        else   for   (int   i   =   1;   i   <=   n;   i++)
                                {
                                        x[t]   =   i;
                                        if   (Place(t))   Backtrack(t   +   1);
                                }
                }
                public   int   n;     //皇后个数
                public   int*   x;   //当前解
                public   long   sum;     //当前已经找到的可行解的个数
        }


在form上点按钮,执行下面的代码,为了简单,直接给了n=4
      private   void   NQueenMenu_Click_1(object   sender,   EventArgs   e)
                {


                        listBox1.Items.Clear();
                        Queen   Q   =   new   Queen   (4);
                        Q.Backtrack(1);
                       
                        if   (Q.sum   ==   0)   listBox1.Items.Add( "无解 ");
                        else
                        {
                                listBox1.Items.Add(Q.sum);  
                        }

                }

这里得到的只是解的个数,没有详细的解序列。能否将每个解序列都输出?类的代码应该怎样修改?
谢谢。


[解决办法]
public void Backtrack(int t)
{
if (t > n)
{
sum++;
这里输出就是了。
}
else for (int i = 1; i <= n; i++)
{
x[t] = i;
if (Place(t)) Backtrack(t + 1);
}
}

[解决办法]
回溯法 理论上能求出 任何有限集问题的任何解。但你的程序我没看,不会

热点排行