梵塔问题 启发函数

wyn990 2009-05-09 06:35:43
大侠们,能给小弟提供个梵塔问题的启发函数么?小弟感激不尽呀~~~~
...全文
207 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunny3106 2009-05-20
  • 打赏
  • 举报
回复
lz想用搜索算法,ls的看来理解错了
没试过这个问题用搜索的,lz搞定了把代码贴出来研究下啊 哈哈^_^
coxfilur_2008 2009-05-20
  • 打赏
  • 举报
回复
连抄带改的程序,Microsoft VC++ 2005下编译通过,可运行。
主要的函数是 simtowers.
没用递归,但不知道是不是你想要的。不知道什么是“启发式图搜索”。

// Hanoi.cpp : 定义控制台应用程序的入口点。
//

#include "stack"
#include "iostream"
using namespace std;
#include "stdlib.h"

struct Param{
int nVal;
int nRetAddress;
char cFrom;
char cTo;
char cAux;
};

void Mov(int m,char x,char y);

void simtowers(int n);

void main() {

simtowers(3);// 输入参数是盘子个数.

system("pause");
}

/* 把n个盘子from柱借助tmp柱移到to柱*/
/* 算法中未考虑进出栈异常情况 */
void simtowers( int n) {
Param currArea;
/* 堆栈数据区初始化 */
currArea.nVal = 0;
currArea.cFrom = ' ';
currArea.cTo=' ';
currArea.cAux=' ';
currArea.nRetAddress=0;
stack<Param> S;
S.push(currArea);
/* 当前工作区初始化 */
currArea.nVal =n;
currArea.cFrom = 'A';
currArea.cTo = 'C';
currArea.cAux = 'B';
currArea.nRetAddress = 1;
short int nRetAddr=-1;
/* 以下为模拟出口 */
start:
if(currArea.nVal == 1)
{
Mov(1,currArea.cFrom,currArea.cTo);
nRetAddr = currArea.nRetAddress;

currArea = S.top();
S.pop();
switch(nRetAddr)
{
case 1 :
goto lable1;
case 2 :
goto lable2;
case 3 :
goto lable3;
}
}
/* 以下模拟递归自调用过程 */
S.push(currArea);
currArea.nVal --;
swap(currArea.cTo,currArea.cAux);
currArea.nRetAddress = 2;
goto start;
/* 以下模拟返回第一次调用 */
lable2:
Mov(currArea.nVal,currArea.cFrom,currArea.cTo);
S.push(currArea);
currArea.nVal --;
swap(currArea.cFrom,currArea.cAux);
currArea.nRetAddress = 3;
goto start;
/* 以下模拟返回第二次递归调用 */
lable3:
nRetAddr = currArea.nRetAddress;
currArea = S.top();
S.pop();
switch(nRetAddr)
{
case 1 :
goto lable1;
case 2 :
goto lable2;
case 3 :
goto lable3;
}
/* 以下模拟返回主调函数 */
lable1:
return;
}

void Mov(int m,char x,char y)
{
cout <<" Mov "<<m <<" from "<<x <<" to "<<y<<endl;
}
wyn990 2009-05-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cuidx 的回复:]
#include <stdio.h>
//将 n -1个盘子,从f柱子移动到t柱子
//3个柱子分别用数字0、1、2来表示,第三个柱子就是3 - f - t
int move(int f,int t,int n)
{
int cnt = 0;
if ( n == 1 ) { //只有1个柱子时,直接移动
cnt = 1;
printf("%c-->%c\n",f + 'A',t + 'A');
} else {
cnt += move(f,3 - f - t,n-1);//先把上面的n - 1个盘子,移到第三个柱子上
cnt += move(f,t,1);//把最下面的盘子移到t上
cnt += …
[/Quote]
谢谢你 但是我不是要递归函数 我意思是用启发式图搜索做 需要找个效率搞一点的启发函数
wyn990 2009-05-13
  • 打赏
  • 举报
回复
谢谢你 但是我不是要递归函数 我意思是用启发式图搜索做 需要找个效率搞一点的启发函数
cuidx 2009-05-12
  • 打赏
  • 举报
回复
#include <stdio.h>
//将 n -1个盘子,从f柱子移动到t柱子
//3个柱子分别用数字0、1、2来表示,第三个柱子就是3 - f - t
int move(int f,int t,int n)
{
int cnt = 0;
if ( n == 1 ) { //只有1个柱子时,直接移动
cnt = 1;
printf("%c-->%c\n",f + 'A',t + 'A');
} else {
cnt += move(f,3 - f - t,n-1);//先把上面的n - 1个盘子,移到第三个柱子上
cnt += move(f,t,1);//把最下面的盘子移到t上
cnt += move(3 - f - t,t,n-1);//最后把第三个柱子上的n - 1个盘子移到t上
}
return cnt;
}

int main()
{
int r = 0;
r = move(0,1,8);
printf("总移动次数:%d\n",r);
getchar();
return 0;
}

移动的总次数是2的n次方减1,至少在个数上算对了
xiangjie493664988 2009-05-10
  • 打赏
  • 举报
回复
额........ lg

5,530

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 模式及实现
社区管理员
  • 模式及实现社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧