整数变换问题和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
..................
![](http://img.blog.csdn.net/20160104141555717?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
限制条件问题分析:
对于整数变换问题,采用分支树,限制条件有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;
}
程序执行结果:
整数变换问题:图一
![](http://img.blog.csdn.net/20160104141733848?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
N皇后问题:图二
![](http://img.blog.csdn.net/20160104141949769?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20160104142014383?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
beep_博客 : http://blog.csdn.net/beep_
问题一:整数变换问题: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_
相关文章推荐
- c语言中数组中的地址和指针的关系
- C++界面库
- 利用C++11实现一个自动注册的工厂
- C++ friend keyword
- C语言项目答辩总结
- C++ 11 可变参数宏结合可变参数模板使用!
- C++ string 用法詳解
- c++静态成员变量的使用
- 分享C++寫blueprint block的方法
- 两条未知曲线,求其最短距离
- 介绍Unreal Engine 4中的接口(Interface)使用C++和蓝图
- c++中this指针的用法小结
- 将那些对称的字符串按从小到大的顺序输 出。字符串先以长度论大小,如果长度相同,再以 ASCII 码值为排序标准。
- 将 01 串首先按长度排序,长度相同时,按 1 的个数多少进行排序, 1 的个数相同时再 按 ASCII 码值排序。
- C++ Primer Plus第六版-第八章学习笔记
- C++ 中list的使用说明
- C++跨平台类型定义
- C++常用预定义
- C语言制造一个随机数
- c++ primer 学习笔记18 关联容器