整数变换问题和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;
}
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_
- 整数变换问题和N皇后问题解析(C语言)
- C语言编程 N皇后问题求解
- 递归求解N皇后问题(c语言)
- 关于C语言的N皇后问题
- C语言实现N皇后问题源代码
- N 皇后问题C语言实现
- N皇后问题c语言解法
- 【C++】n皇后问题
- [算法]经典算法8皇后(N皇后)问题的解法,C语言实现
- 8皇后问题和N皇后问题
- C/C++ N皇后问题
- N皇后问题 c/c++
- n皇后问题--c代码
- 八皇后问题(N皇后问题)
- 汉诺塔和N皇后问题
- n皇后问题和2n皇后问题
- 8皇后问题(c 语言描述)
- 八皇后问题(C语言版本)
- 开放-封闭原则
- html知识复习
- ubuntu12.04 下安装配置samba
- poj-3185 The Water Bowls
- Mysql 里CHAR和VARCHAR的最大长度及一些注意事项
- 整数变换问题和N皇后问题解析(C语言)
- 七、Linux/UNIX操作命令积累【touch、chkconfig】
- getopt:命令行选项、参数处理
- POJ-3276 Face The Right Way
- android常见的库文件
- git学习推荐
- Angularjs1.x 中的 constant, value
- MySql安装种种
- 电池状态获取(UIDevice、battery、UIDeviceBattery)