Beispiel #1
0
    //Thực hiện cho đi đĩa đầu tiên
    public void ChoDia()
    {
        //Tạo 1 Tháp mới với chiều cao giảm đí 1
        Thap moi = new Thap();

        moi.CacDia = new Dia[this.CacDia.Length - 1];
        //Huỷ các đĩa hiện tại ra khỏi Tháp cũ
        for (int i = 0; i < this.CacDia.Length; i++)
        {
            this.Controls.Remove(this.CacDia[i]);
        }
        //Chuyển các đĩa của Tháp cũ qua Tháp mới(không có đĩa đầu tiên)
        for (int i = 0; i < moi.CacDia.Length; i++)
        {
            moi.CacDia[i]          = new Dia(this.CacDia[i + 1].So);
            moi.CacDia[i].Location = this.CacDia[i + 1].Location;
        }

        //Thay Tháp cũ bằng Tháp mới
        this.CacDia = moi.CacDia;
        for (int i = 0; i < this.CacDia.Length; i++)
        {
            this.Controls.Add(this.CacDia[i]);
        }
        this.Controls.Add(this.CayCot);
    }
Beispiel #2
0
    public static Thap TaoKhoiDau(Dia diadau)
    {
        Thap kq = new Thap();

        kq.CacDia = new Dia[diadau.So + 1];
        for (int i = 0; i < kq.CacDia.Length; i++)
        {
            kq.CacDia[i]          = new Dia(i);
            kq.CacDia[i].Location = new Point(100 - i * 5, 300 - (diadau.So - i) * 15);
            kq.Controls.Add(kq.CacDia[i]);
        }
        kq.Controls.Add(kq.CayCot);
        return(kq);
    }
Beispiel #3
0
    private void BtSoDia_Click(object o, EventArgs e)
    {
        int so;

        try
        {
            so = int.Parse(this.TbSoDia.Text);
        }
        catch
        {
            MessageBox.Show("Nhập Cho Đúng Đi Mà!\n\tOK?");
            this.TbSoDia.Text = string.Empty;
            return;
        }
        if (so <= 20)
        {
            this.Controls.Remove(this.CacThap[0]);
            this.CacThap[0]          = Thap.TaoKhoiDau(int.Parse(this.TbSoDia.Text));
            this.CacThap[0].Location = new Point(0, 220);
            this.Controls.Add(this.CacThap[0]);

            this.Controls.Add(this.BtKhoiDongLai);

            this.LbSoDia.Text      = "Số lần đã chuyển: " + this.SoLanChuyen;
            this.LbSoDia.ForeColor = Color.GreenYellow;

            this.LbSoDia.Location = new Point(340, 68);
            this.LbSoDiaDung.Text = "Số đĩa đã chuyển hoàn thành: " + this.CacThap[2].SoDiaDung(int.Parse(this.TbSoDia.Text));

            this.BtDiChuyen                       = new Button();
            this.BtDiChuyen.Location              = new Point(355, 150);
            this.AutoSize                         = true;
            this.BtDiChuyen.BackgroundImage       = global::ThapHaNoi.Properties.Resources.dichuyenon;
            this.BtDiChuyen.BackgroundImageLayout = ImageLayout.Stretch;;
            this.BtDiChuyen.Click                += new EventHandler(ThuatGiaiThapHaNoi);
            this.Controls.Add(this.BtDiChuyen);

            this.TbSoDia.Hide();
            this.BtSoDia.Hide();
        }
        else
        {
            MessageBox.Show("Không đủ màn hình để biểu diễn!\n    Xin vui lòngnhập số <= 20");
        }
    }
Beispiel #4
0
    //Nhận chỉ số của Tháp gửi x và Tháp gửi y và trả về chi phí
    private int TinhChiPhi(int x, int y)
    {
        //Nếu việc gửi nhận không thành công thì chi phí giữ nguyên hiện tại
        int kq = this.CacThap[2].SoLanItNhat(int.Parse(this.TbSoDia.Text));

        //Gửi được nếu Tháp gửi có đĩa
        if (this.CacThap[x].CacDia.Length != 0)
        {
            //Nhưng Tháp nhận phải không có đĩa hoặc có đĩa thì đĩa đầu có phải lớn hơn đĩa đầu của Tháp gửi
            if ((this.CacThap[y].CacDia.Length == 0) || (this.CacThap[y].CacDia.Length != 0 && this.CacThap[x].CacDia[0].Width < this.CacThap[y].CacDia[0].Width))
            {
                //Nếu Tháp gửi là Tháp C
                if (x == 2)
                {
                    //Tạo Tháp tam giống Tháp C để tính chi phí
                    Thap tam = new Thap();
                    tam.CacDia = new Dia[this.CacThap[2].CacDia.Length];
                    for (int i = 0; i < this.CacThap[2].CacDia.Length; i++)
                    {
                        tam.CacDia[i] = new Dia(this.CacThap[2].CacDia[i].So);
                    }
                    //Thực hiện cho đĩa trước khi tính chi phí
                    tam.ChoDia();
                    kq = tam.SoLanItNhat(int.Parse(this.TbSoDia.Text));
                }
                //Nếu Tháp nhận là Tháp C
                if (y == 2)
                {
                    Thap tam = new Thap();
                    tam.CacDia = new Dia[this.CacThap[2].CacDia.Length];
                    for (int i = 0; i < this.CacThap[2].CacDia.Length; i++)
                    {
                        tam.CacDia[i] = new Dia(this.CacThap[2].CacDia[i].So);
                    }
                    //Thực hiện nhận đĩa trước khi tính chi phí
                    tam.NhanDia(this.CacThap[x].CacDia[0]);
                    kq = tam.SoLanItNhat(int.Parse(this.TbSoDia.Text));
                }
            }
        }
        return(kq);
    }
Beispiel #5
0
    //Tính số đĩa đúng vị trí so với Tháp khởi đầu
    public int SoDiaDung(int sodia)
    {
        //Tạo 1 Tháp tương đương Tháp khởi đầu để so sánh
        Thap tam = Thap.TaoKhoiDau(sodia);
        int  kq  = 0;
        //Kiểm tra từ dưới lên
        int k = tam.CacDia.Length - 1;

        for (int i = this.CacDia.Length - 1; i >= 0; i--)
        {
            //Nếu đĩa đúng vị trí thì đếm được thêm 1 đĩa
            if (this.CacDia[i].Width == tam.CacDia[k--].Width)
            {
                kq++;
            }
            //Ngược lại dừng
            else
            {
                break;
            }
        }
        return(kq);
    }