#include #include unsigned WINDOW_HEIGHT = 20; constream AnnoiCon; const unsigned MAX_DISKS_NUM = 10; class Annoi_Towers { protected: unsigned disks_num; char towers[3][MAX_DISKS_NUM]; unsigned long move_num; void(*present_move)(unsigned,unsigned,unsigned); public: Annoi_Towers(unsigned,void(*)(unsigned,unsigned,unsigned)); void move_disk(); void creat_1p_tower(unsigned); void move_all_disks(); }; Annoi_Towers::Annoi_Towers(unsigned new_disks_num, void(*new_pm)(unsigned,unsigned,unsigned)) { disks_num=new_disks_num; present_move = new_pm; // The direction is upwards: for(unsigned a=0;a>=1; n++; } to = 2-n%2; _movenum>>=1;n++; while(_movenum) { if (n%2) { to-=_movenum%2;from-=_movenum%2; } else { to+=_movenum%2;from+=_movenum%2; } _movenum>>=1;n++; } to=(to+3000)%3;from=(from+3000)%3; // In case from or to are negative. for(from_high=0;from_highgotoxy(tower*2+1,WINDOW_HEIGHT-place); if (new_disk) { (AnnoiCon.rdbuf())->textcolor(new_disk); AnnoiCon << (char)('0'+new_disk); } else AnnoiCon << ' '; } int main() { AnnoiCon.window(1,1,80,25);AnnoiCon.clrscr(); AnnoiCon.window(1,1,8,WINDOW_HEIGHT); Annoi_Towers annoi(9,&AnnoiConMove); annoi.move_all_disks(); getch(); return 0; }