Go Back   VN-Zoom Forum > Chia sẻ kiến thức > Lập trình > Pascal | C/C++

 



Trả lời Gửi Ðề Tài Mới
 
Ðiều Chỉnh Xếp Bài
Old 06-09-2008, 12:17   #1
Búa Gỗ Đôi
 
KhaiCali's Avatar
 
Tham gia: Sep 2008
Bài: 34
VZD: 1.219
Điểm: 1/1 bài viết
Default moi người giúp em với : tìm đường đi của quân mã

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
KhaiCali vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 06-09-2008, 18:30   #2
Rìu Sắt Đôi
 
darling's Avatar
 
Tham gia: Dec 2007
Bài: 237
VZD: 5.951
Điểm: 85/48 bài viết
Default

Đồ họa thì mình ko giúp đc rồi.
Mình bit 1 cách làm: sử dụng đệ qui quay lùi - kiểu như mò mê cung vậy. Đi đường này sai quay về lại 1 bước để đi đường khác



it9x.co.cc
__________________
http://it9x.co.cc

darling vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 06-09-2008, 18:30   #3
Rìu Sắt Đôi
 
darling's Avatar
 
Tham gia: Dec 2007
Bài: 237
VZD: 5.951
Điểm: 85/48 bài viết
Default

Đồ họa thì mình ko giúp đc rồi.
Mình bit 1 cách làm: sử dụng đệ qui quay lùi - kiểu như mò mê cung vậy. Đi đường này sai quay về lại 1 bước để đi đường khác



it9x.co.cc
__________________
http://it9x.co.cc

darling vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 06-09-2008, 19:27   #4
Búa Đá
 
thanhsangdt's Avatar
 
Tham gia: Oct 2007
Bài: 70
VZD: 2.295
Điểm: 21/18 bài viết
Default

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
thanhsangdt vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Thành viên đã cám ơn bài viết này của thanhsangdt:
KhaiCali (11-09-2008)
Old 07-09-2008, 00:52   #5
Búa Đá
 
tcliang's Avatar
 
Tham gia: Aug 2008
Bài: 51
VZD: 990
Điểm: 11/9 bài viết
Default

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
tcliang vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Thành viên đã cám ơn bài viết này của tcliang:
KhaiCali (11-09-2008)
Old 09-09-2008, 09:05   #6
Thành viên đang bị kỷ luật
 
ijkl710's Avatar
 
Tham gia: Aug 2008
Bài: 14
VZD: 932
Điểm: 2/2 bài viết
Wink everquest 2 plat

ijkl710 vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 11-09-2008, 12:34   #7
Búa Gỗ Đôi
 
KhaiCali's Avatar
 
Tham gia: Sep 2008
Bài: 34
VZD: 1.219
Điểm: 1/1 bài viết
Default

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
KhaiCali vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 13-09-2008, 22:43   #8
Búa Gỗ Đôi
 
hano's Avatar
 
Tham gia: Oct 2007
Bài: 34
VZD: 1.342
Điểm: 0/0 bài viết
Default

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!!!
hano vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời Gửi Ðề Tài Mới

Ðiều Chỉnh
Xếp Bài

Quyền Sử Dụng Ở Diễn Ðàn
Bạn không thể gửi chủ đề mới
Bạn không thể gửi trả lời
Bạn không thể gửi file đính kèm
Bạn không thể tự sửa bài viết của bạn

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt
Trackbacks are Tắt
Pingbacks are Tắt
Refbacks are Tắt
Chuyển đến


Múi giờ GMT +7. Hiện tại là 15:38.


Powered by vBulletin® Version 3.7.3
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
vBCredits v1.4 Copyright ©2007 - 2008, PixelFX Studios
Từ điển được cung cấp bởi VDict.com - Hosting được tài trợ bởi Rao vặt 123