能帮忙验证下这段完全非递归解决汉诺塔问题的c代码吗?

逆向菜鸟 2019-07-19 09:26:08
我用数学,求出第几步,是几号柱子到几号柱子,每一步都能直接求出来。然后我写了这个程序验证,我的数学思路是对的。
博客一直审核,我就发论坛了。

// helloworld.cpp : Defines the entry point for the console application.
//
//by 陈墨仙 2019-07-18
//完全不用递归解汉诺塔
#include "stdafx.h"
#include <windows.h>
int h[34];//为了便于理解,0号元素不用,33个盘子
int a[4][34];
int b[4];
int jihao;
int dijici;

void printH()
{
//system("cls");
for(int i = 1;i<=34;i++)
{
printf("%d:%d\t",i,a[3][i]);
}

}
bool jiancha(int * h)//检测是否在下面的都是编号小的
{
int d[4];
d[1]=0;
d[2]=0;
d[3]=0;
for(int j = 1;j<4;j++)
{
for(int i = 1;i<34;i++)
{
if(a[j][i]==0 || a[j][i]>a[j][i-1])
{

}
else
{
printf("error a[%d][%d] = %d a[%d][%d]=%d",j,i-1,a[j][i-1],j,i,a[j][i]);
scanf("%d");
return false;
}
}
}
return true;
}
bool shunxu(int zhuzi)
{
for(int i = 1; i< b[zhuzi];i++)
{
if(a[zhuzi][i]==34-i)
{
}
else
{
return false;
}
}
return true;
}
bool chenggong(int n,int zhuzi)//n号盘是否都移到3
{

int d = 0;
int t = 34;
for(int i = 33;i>33-n;i--)
{
if(a[zhuzi][34-i]!=i-n+1)
{
return false;

}
}

return true;

}
int jc3()//检测3号柱的盘子有几个
{

int d = 0;
int t = 34;
for(int i = 33;i>0;i--)
{
if(h[i]==3)
{
d=d+1;
t = i;
}
}
return d;
}
int jc1()//检测1号柱的盘子有几个
{

int d = 0;
int t = 34;
for(int i = 33;i>0;i--)
{
if(h[i]==1)
{
d=d+1;
t = i;
}
}
return d;
}
void initH()
{
for(int i = 0;i<34;i++)
{
h[i]=1;
a[1][i]=i;
a[2][i]=0;
a[3][i]=0;
}
b[1]=34;
b[2]=1;
b[3]=1;
}
int jc2()//检测2号柱从33往下盘子有几个
{

int d = 0;
int t = 34;
for(int i = 33;i>0;i--)
{
if(h[i]==2)
{
d=d+1;
t = i;
}
}
return d;
}
int getTop(int zhuzi)
{
int d = 0;
int t = 0;
for(int i = 1;i<34;i++)
{
if(h[i]==zhuzi && i>t)
{

t = i;
}
}
return t;
}
bool jiou(int s)
{
if(s % 2 == 0)
{
return true;
}
else
{
return false;
}
}
void change(int i,int yuan,int mubiao)
{
if(h[i] == yuan)
{
h[i] = mubiao;
a[mubiao][b[mubiao]]=i;
b[mubiao]=b[mubiao]+1;
a[yuan][b[yuan]]=0;
b[yuan]=b[yuan]-1;
printf("h[%d]:%d->%d",i,yuan,mubiao);
}
else
{
printf("Error h[%d] = %d",i,h[i]);
scanf("%d");
}
jiancha(h);
}
int FastLog2(int x)
{
float fx;
unsigned long ix, exp;

fx = (float)x;
ix = *(unsigned long*)&fx;
exp = (ix >> 23) & 0xFF;

return exp - 127;
}
int chu2(int n ,int cishu)
{
for(int j = 1; j<= cishu;j++)
{
n=n/2;
}
return n;
}
void jihaopan(int n)
{
int i = 1;
int yuan = n;
while(1)
{
if(n%2==1)
{
jihao = i;
dijici = chu2(yuan,i)+1;
break;
}
n=n/2;
i=i+1;
}

//printf("几号盘%d,第几次%d",jihao,dijici);
}
int main(int argc, char* argv[])
{
printf("汉诺塔!\n");
int times = 0;
initH();
int ji = 1;
for(int i = 1;i<5559060534555523;i++)
{
jihaopan(i);
if(jiou(jihao)==false)
{
int tmp;
tmp = dijici%3;
if(tmp==1)
{
change(getTop(1),1,3);
}
else if(tmp==2)
{
change(getTop(3),3,2);
}
else
{
change(getTop(2),2,1);
}
}
else
{
int tmp;
tmp = dijici%3;
if(tmp==1)
{
change(getTop(1),1,2);
}
else if(tmp==2)
{
change(getTop(2),2,3);
}
else
{
change(getTop(3),3,1);
}
}
if(chenggong(33,3))
{
printf("sssss");
break;
}
}



return 0;
}
...全文
118 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
逆向菜鸟 2019-09-24
  • 打赏
  • 举报
回复
已经成功了。
这是下载地址

https://github.com/corivsky/corivsky
逆向菜鸟 2019-09-24
  • 打赏
  • 举报
回复
我的方法,没有用到递归,也没用到堆栈。。。。。
逆向菜鸟 2019-09-24
  • 打赏
  • 举报
回复


递归与非递归的比对结果是 nodifferences
zgl7903 2019-07-20
  • 打赏
  • 举报
回复
用一个标准的递归型的汉诺塔程序解算对比下呗
逆向菜鸟 2019-07-19
  • 打赏
  • 举报
回复
假设盘子总数为奇数,目标从1移到3号柱。
奇数盘 移动顺序循环是 1->3 3->2 2->1
偶数盘 1->2 2->3 3->1

第n步是几号盘第几次移动?
假设最上方1号盘,往下增大。

n%2=1 1号盘 第 n/2+1 次移动
n%2=0 (n/2)%2=1 2号盘 第(n/2/2)+1次移动
以此类推

根据奇数盘偶数盘以及移动次数对3取余,可以算出是几号柱子到几号柱子
逆向菜鸟 2019-07-19
  • 打赏
  • 举报
回复
盘子的个数必须为奇数。偶数我也算出来了,盘子总数是奇数还是偶数,移动方向不同。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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