您的位置:首页 > 编程语言 > C语言/C++

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

2016-01-04 14:13 344 查看
说明:以前的算法现在公布一下。

问题一:整数变换问题: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;

}

N 皇后限制条件程序描述:

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_
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: