程序員考試筆記八:諾漢塔的原理
今天回到學(xué)佼也沒有講課,因?yàn)槔蠋熋χ恍┢渌拢犝f好像是多媒體比賽的吧,要今天上交了。那我們只好回到課室里自己看書了,不過在這段時(shí)間里我們都沒有看什么書,只是大家聊了起來。我也插了嘴吹了幾句,可是很快就沒有心情了,唉!只好睡一睡吧。當(dāng)我休息了一會發(fā)現(xiàn)老師都已經(jīng)回來了,而且說讓我們今天上機(jī)房。今天是***次上機(jī)房,不過如果不是什么事我也不愿上機(jī)房,因?yàn)槲矣X得聽老師講課還好。我們上到機(jī)房,老師給了一條程序我們,喔!這不是前兩天說要搞的那個(gè)諾漢塔嗎!而且是結(jié)合了圖形表示的。我們都興奮起來了,開始研究著這條程序。我開始執(zhí)行這個(gè)諾塔了,他給的參數(shù)不是很多,只是十個(gè)盤子而已,你知道我按了多長時(shí)間嗎?我一直按著來看也看了快一個(gè)5分鐘才看完啊,這個(gè)問題果然是復(fù)雜??粗@些圖畫演示讓我更加清晰的明白了諾漢塔的原理,這里我不敢自私,我把源程序也COPY回家了,以下就是了:
#include
#include
char dd[10][20],space[20];
int a[11],b[11],c[11];
init()
{
int i,j;
for(i=0;i<20-1;i++) space[i]=' ';
space[i]='\0';
for(i=0;i<10;i++)
{ for(j=0;j<20-1;j++)dd[i][j]=' ';
dd[i][j]='\0';
for(j=9-i;j<=9+i;j++)dd[i][j]='a'+i;
}
for(i=0;i<10;i++) a[i]=i,b[i]=-1,c[i]=-1;
a[10]=2,b[10]=25,c[10]=50;
for(i=0;i<10;i++)
{
gotoxy(a[10],10+i);
cprintf("%s",dd[i]);
}
}
move(int *s,int *d)
{ int i,j;
for(i=0;s[i]==-1&&i<10;i++);
gotoxy(s[10],10+i);
cprintf("%s",space);
for(j=0;d[j]==-1&&j<10;j++);
j--;
gotoxy(d[10],10+j);
cprintf("%s",dd[s[i]]);
d[j]=s[i];s[i]=-1;
getche();
}
void hanoi(int n,int *s,int *w,int *d)
{ int i;
if(n==1)move(s,d);
else
{
hanoi(n-1,s,d,w);
move(s,d);
hanoi(n-1,w,s,d);
}
}
main()
{
clrscr();
init();
getche();
hanoi(10,a,b,c);
getche();
}
***除了看了這條程序,老師還給我們試著用TC調(diào)試程序了。你知道我以前調(diào)試程序是怎樣的嗎?我就是直接ALT+F9看看有沒有出錯(cuò),如果有就修改,沒有則成功了??墒钦嫣煳艺嬲J(rèn)識到TC里調(diào)試程序的真正方法,其實(shí)TC里有一大推的調(diào)試工具,這是我以前一直沒有用過的,只知道有一個(gè)就是一步一步執(zhí)行,跟著其它就一無所知了。其實(shí)TC里可以把一些變量的值跟蹤顯示出來,這是調(diào)試程序的重要手段,以前不知道這個(gè)功能都是用筆寫在紙上的,現(xiàn)在可以很方便準(zhǔn)確的看出來了。下面的幾張圖片是我自己切出來的,大家看看就知道知道了(可能大家原來就知道,是我菜擺了)。今天的課程也算學(xué)到東西了吧,我該回去好好利用這個(gè)功能來調(diào)試程序了。