//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); }
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); }
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"); } }
//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); }
//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); }