![]() |
|
|
#1 |
|
Búa Gỗ Đôi
![]() Tham gia: Sep 2008
Bài: 34
VZD: 1.219
Điểm: 1/1 bài viết
|
các anh các chị giúp em với cái bài thuật toán tìm đường đi của quân mã trong cờ vua khó quá , yêu cầu đề ra là sử dụng ngôn ngữ C ++ và mô phỏng thuật toán bằng đồ họa . Viết chương trình bằng ngôn ngữ C ++ để nó chạy được .
Em cám ơn anh chị nhiều lắm ![]() ![]() ![]()
|
|
|
|
|
|
#2 |
|
Rìu Sắt Đôi
![]() Tham gia: Dec 2007
Bài: 237
VZD: 5.951
Điểm: 85/48 bài viết
|
|
|
|
|
|
|
#3 |
|
Rìu Sắt Đôi
![]() Tham gia: Dec 2007
Bài: 237
VZD: 5.951
Điểm: 85/48 bài viết
|
|
|
|
|
|
|
#4 |
|
Búa Đá
![]() Tham gia: Oct 2007
Bài: 70
VZD: 2.295
Điểm: 21/18 bài viết
|
Bạn xem thử coi có giúp gì được ko nào:
#include <stdio.h> #include <conio.h> //Khai báo kiểu và hằng cần dùng typedef int BOOL; const TRUE=1; const FALSE=0; const MAX = 7; // Kiểu miêu tả thông tin của 1 bước đi typedef struct { int x, y; int huong; } ItemRec; // Định nghĩa các biến dữ liệu chính int Banco[MAX+1][MAX+1]; ItemRec Nuocdi[(MAX+1)*(MAX+1)]; int SoNuocdi; int SoNghiem; // Thủ tục khởi động các giá trị đầu của chương trình void Khoidong() { int i,j; SoNghiem = 0; for (i=0; i<=MAX; i++) for (j=0;j<=MAX; j++) Banco[i][j] = -1; // con ma chua di qua o [i,j] printf("Nhập tọa độ hàng chứa con mã : "); scanf("%d",&Nuocdi[0].y); printf("Nhập tọa độ cột chứa con mã : "); scanf("%d",&Nuocdi[0].x); Nuocdi[0].huong = 0; // Thiết lập nước đi đầu tiên của con mã SoNuocdi =0; Banco[Nuocdi[SoNuocdi].x][Nuocdi[SoNuocdi].y] = 0; } // In kết quả con mã đi trên bàn cờ void InKetqua() { int h,c; SoNghiem = SoNghiem + 1; printf("Cách đi thứ : %d\n",SoNghiem); for (h= 0; h <=MAX; h++) { // Hiển thị hàng lưới ngang bàn cờ for (c= 0; c<=MAX;c++) printf("+----"); printf("+\n"); // Hiển thị nội dung hàng thứ h bàn cờ for (c= 0; c<=MAX;c++) printf("| %2d ",Banco[h][c]); printf("|\n"); } // Hiển thị hàng lưới ngang bàn cờ cuối cùng for (c= 0; c<=MAX;c++) printf("+----"); printf("+\n"); } // Thủ tục tìm nước đi kế tiếp // trả về FALSE nếu không tìm được và ngược lại BOOL TimNuocKe() { int x, y; BOOL RetVal; RetVal = FALSE; do { // lặp tìm nước đi kế tiếp đến khi tìm được hoặc hết cách đi while (RetVal==FALSE && Nuocdi[SoNuocdi].huong < 8) { switch (Nuocdi[SoNuocdi].huong) { //thử hướng đi hiện tại case 0 : x = Nuocdi[SoNuocdi].x + 2; y = Nuocdi[SoNuocdi].y - 1; break; case 1 : x = Nuocdi[SoNuocdi].x + 1; y = Nuocdi[SoNuocdi].y - 2; break; case 2 : x = Nuocdi[SoNuocdi].x - 1; y = Nuocdi[SoNuocdi].y - 2; break; case 3 : x = Nuocdi[SoNuocdi].x - 2; y = Nuocdi[SoNuocdi].y - 1; break; case 4 : x = Nuocdi[SoNuocdi].x - 2; y = Nuocdi[SoNuocdi].y + 1; break; case 5 : x = Nuocdi[SoNuocdi].x - 1; y = Nuocdi[SoNuocdi].y + 2; break; case 6 : x = Nuocdi[SoNuocdi].x + 1; y = Nuocdi[SoNuocdi].y + 2; break; case 7 : x = Nuocdi[SoNuocdi].x + 2; y = Nuocdi[SoNuocdi].y + 1; } if (0<=x && x<=MAX && 0<=y && y<=MAX && Banco[x][y]==-1) { // nếu được thì ghi nhận SoNuocdi = SoNuocdi + 1; Banco[x][y] = SoNuocdi; Nuocdi[SoNuocdi].x = x; Nuocdi[SoNuocdi].y = y; Nuocdi[SoNuocdi].huong = 0; RetVal =TRUE; } else // nếu không được thì thử hướng kế tiếp Nuocdi[SoNuocdi].huong = Nuocdi[SoNuocdi].huong + 1; } //end while if (RetVal==FALSE && SoNuocdi != 0) { // nếu không tìm được nước đi kế thì lùi con mã lại 1 bước Banco[Nuocdi[SoNuocdi].x][Nuocdi[SoNuocdi].y] = -1; SoNuocdi = SoNuocdi - 1; Nuocdi[SoNuocdi].huong = Nuocdi[SoNuocdi].huong + 1; } } while (!RetVal && SoNuocdi); return RetVal; } // Chương trình chính void main() { Khoidong(); while (TimNuocKe()) if (SoNuocdi == (MAX+1)*(MAX+1)-1) { // nếu tìm được 1 nghiệm InKetqua(); getch(); Banco[Nuocdi[SoNuocdi].x][Nuocdi[SoNuocdi].y] = -1; SoNuocdi = SoNuocdi -1; Nuocdi[SoNuocdi].huong = Nuocdi[SoNuocdi].huong + 1; } } để tìm được kết quả thực sự, bạn nên chọn kích thước bàn cờ 4,5,6 là vừa (khai báo lại hằng MAX = 3,4,5).
__________________
Getlink Rapidshare/MegaUpload
http://bookilook.com/?uid=80302 thay đổi nội dung bởi: thanhsangdt, 06-09-2008 lúc 19:38 |
|
|
|
| Thành viên đã cám ơn bài viết này của thanhsangdt: | KhaiCali (11-09-2008) |
|
|
#5 |
|
Búa Đá
![]() Tham gia: Aug 2008
Bài: 51
VZD: 990
Điểm: 11/9 bài viết
|
chi đơn giản vậy thôi
bool checkHorse(char curPosY, char desPosY, char curPosX, char desPosX){ ////điều kiện biên bàn cờ, bạn tự chỉnh sửa if(desPosY < 0 || desPosY > 9 || dexPosX < 0 || desPosX > 8) return false; ////điều kiện 8 hướng đi của con mã if( (((max(curPosY,desPosY) - min(curPosY,desPosY)) == 1) && ((max(curPosX,desPosX) - min(curPosX,desPosX)) == 2) && isEmpty((curPosX + desPosX) >> 1), curPosY) || (((max(curPosY,desPosY) - min(curPosY,desPosY)) == 2) && ((max(curPosX,desPosX) - min(curPosX,desPosX)) == 1) && isEmpty(curPosX, (curPosY + desPosY) >> 1)) ) return true; else return false; } curPosX là tọa độ X của con mã hiện tại, desPosX là tọa độ X con mã muốn tới. curPosY là tọa độ Y của con mã hiện tại, desPosY là tọa độ Y con mã muốn tới. isEmpty(x,y) là hàm đơn giản chỉ để xác định điểm x,y có cờ hay không, vì theo luật, con mã không được đi khi có cờ ở giữa. (curPosX+desPosX)>>2 : là tìm trung điểm. chò chơi cờ tướng và cờ mù hồi trước mình viết với đứa bạn. thay đổi nội dung bởi: tcliang, 07-09-2008 lúc 01:06 |
|
|
|
| Thành viên đã cám ơn bài viết này của tcliang: | KhaiCali (11-09-2008) |
|
|
#6 |
|
Thành viên đang bị kỷ luật
![]() Tham gia: Aug 2008
Bài: 14
VZD: 932
Điểm: 2/2 bài viết
|
|
|
|
|
|
|
#7 |
|
Búa Gỗ Đôi
![]() Tham gia: Sep 2008
Bài: 34
VZD: 1.219
Điểm: 1/1 bài viết
|
em cám ơn các bro nhiều lắm đó may mà có anh thanhdt giúp đỡ nhưng còn cái mô phỏng thuật toán thì phải làm sao hả anh
|
|
|
|
|
|
#8 |
|
Búa Gỗ Đôi
![]() Tham gia: Oct 2007
Bài: 34
VZD: 1.342
Điểm: 0/0 bài viết
|
mô phỏng thuật toán bác khaicali đi tìm cuốn 1 số vấn đề cơ bản của pascal hình như có ghi rõ thuật toán!!! hoặc bác tự dịch chương trình ra sẽ biết được thôi!!!
|
|
|
|