整数变换问题和N皇后问题解析(C语言)

来源:互联网 发布:JavaScript什么是闭包 编辑:程序博客网 时间:2024/04/30 14:22

说明:以前的算法现在公布一下。

问题一:整数变换问题:2个整数M,N,求M经过F(i)=3i,g=(int)g/2,变换后变为N的最小次数和变换序列。
问题二:N皇后问题,如何排列N个皇后使在同一行或列或对角线不存在2个皇后。以使其不相互攻击。

解答:采用回溯法,第一步,列出二个问题的排列和分支树。

皇后问题的排列树:

开始   0

第一行 |                                  |    |    |   |    |    |    |

       1                                 2.......3...... 4.....5.......6......7........8

       |   |    |   |  |   |   |

第二行 2   3   4  5  6  7  8

       | | | | | | |

       34 5678

       |

       4.....8

       |

       5...8

       :

       8

整数变换的分支树:

                      M

                    |     |

                    F    G

                 |     |  |    |

                 F    G F   G

                 ..................


限制条件问题分析:

对于整数变换问题,采用分支树,限制条件有3

1,分支变换节点的整数值为0时,减去该分支。

2,分支变换的深度大于已知最大深度时减去分支。

3,分支的节点与其上面的节点的整数值相同时,则这个节点到上面节点之间的变换为多余变换,应该减去该分支。

对于皇后问题限制条件为:

1,同一行列出行2个以上皇后减去分支。

2,对角线出现2个以上皇后减去分支。

 

程序表示:

整数变换限制条件程序描述:

.void backtrack()

{   

int i;

    void action(int);

void deaction(int);

if(m==n) { 

     //输出,省略。。

}

else

{  

  for(i=1;i>=0;i--)

{

         action(i);

         if(m>0&&l<=maxl&&check()) backtrack();

   deaction(i);

        }

}

}

 

int check()

{

  int i,flag=1;

  for(i=0;i<l;i++)

 { if(temp[i]==m){ 

  flag=0;break;}}

  return flag;

 

}

 

皇后限制条件程序描述:

void backtrack(int t)

{  int i;

   if(t>n) 

   put();

   else

   {

     for(i=t;i<=n;i++)

   {

       swap(t,i);

       if(check(t)) backtrack(t+1);

        swap(t,i);

     }

   }

  

}

int check(int t)

{

   int i;

   for(i=1;i<t;i++)

   {

     if((abc(t,i)==abc(x[t],x[i]))||x[i]==x[t]) return 0;

 

   }

   return 1;

 

}

 

程序执行结果:

整数变换问题:图一


N皇后问题:图二


beep_博客 : http://blog.csdn.net/beep_




1 0
原创粉丝点击