# GÓC SÁNG TẠO > Khu vực lập trình > Pascal/Delphi/Kylix >  Mình có bài này hay

## vanvuive

Cho bàn cờ có n x n ô. Một quân Mã được phép đi theo luật cờ vua,đầu tiên được đặt ở ô có tọa độ (x,y).Lập chương trình tìm tất cả các đường đi của quân Mã sao cho mọi ô trên bàn cờ đều được quân Mã đi qua đúng 1 lần.
Chúc may mắn [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]

----------


## diemmy9x

Thêm một bài hay nữa nè:
Cho một biểu thức toán học chỉ gồm các số, khoảng trắng, dấu + - * / hoặc các cặp dấu ngoặc ()
Lập chương trình tính ra giá trị của chuỗi đã nhập và in ra kết quả.

----------


## vemaybayvietmy06

Nếu bạn nào cần lời giải thì chờ sau 5 ngày chúng tôi sẽ đăng lên.

----------


## longcheng

Đây là bài pascal tư duy:
Có N (N <= 100) cặp vợ chồng cùng đợi để qua sông. Chỉ có một con thuyền nhỏ trên đó chở được không quá 2 người.
Tìm cách đưa cả N cặp vợ chồng này qua sông biết rằng N ông chồng này có tính cả ghen nên không ai muốn để vợ mình 
đứng một mình với một người đàn ông khác.

----------


## bigrat96

Lời giải bài qua sông:
{ṨQ+, R+} uses crt;
Const max = 100;
Var n: Integer;
Procedure Nhap;
Begin
Clrscr;
Writeln(' Dua n cap vo chong qua song');
Repeat
Write(' Cho so cap vo chong: '); Readln(n);
Until (n > 0) and (n <= max);
End;
Procedure xuly;
Var i: Integer;
Begin
i:= 1;
While i < n do
Begin
Writeln(' Dua cap thu ',i,' sang song: ');
Writeln(' Ba ',i,' va ba ',i+1,' sang');
Writeln(' Ba ',i+1,' quay lai');
Writeln(' Ong ',i+1,' va ba ',i+1,' sang');
Writeln(' Ong ',i+1,' quay lai');
Writeln(' Ong ',i,' va ong ',i+1,' sang');
If i+1 < n Then
Writeln(' Ong ',i+1,' va ba ',i+1,' quay lai');
Inc(i);
End;
Writeln(' Cap thu ',n,' da sang song');
End;
Begin
Repeat
Nhap;
Xuly;
Until Readkey = #27;
End.

----------


## yentatoo

Bài mới đây: DÃY SỐ HẠNH PHÚC
Dãy số nguyên dương a1, a2, ..., an được gọi là DÃY SỐ HẠNH PHÚC nếu nó thỏa mãn các điều kiện sau:
+ Là dãy số giảm dần.
+ Với mỗi ai với i > 1 thì ai hoặc là số nguyên tố hoặc là ước của một trong các số từ a1 đến ai-1.
Lập trình nhập từ bàn phím số nguyên dương N <= 10000 sau đó đưa ra màn hình dãy số hạnh phúc dài nhất bắt đầu từ N.
Chúc vui vẻ.

----------


## duylp8686

trời ơi nhiều quá
coi chừng bội thực
bài dãy số hạnh phúc khoai quá. phải chi kiu kiểm tra dãy số có phải là DSHP không thì mình làm được [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]

----------


## buivanquang.ltv

Bài hay nè:
Các hoán vị của n chữ cái hoa Tiếng anh A..Z được sắp tăng theo trật tự từ điển và được viết liền nhau để tạo thành một dãy kí tự duy nhất. Xác định kí tự thứ m trong dãy, gọi là kí tự c.
Dữ liệu vào: Cho trong File vb mang tên HV.INP, gồm 1 dòng chứa 2 số nguyên n và m. Các số trên cùng dòng cách nhau bởi 1 dấu cách. 1<=n<=10, 1<=m<=n*n!
Dữ liệu ra: vào file văn bản mang trên HV.OUT, gồm 1 dòng cho biết kí tự thứ m trong dãy
Thí dụ:
HV.INP HV.OUT
4 15 D
Trong thí dụ trên, do n = 4 nên ta có dãy: ABCDABCDABCDABCD.... và do đó kí tự thứ 15 trong dãy sẽ là D.
Cố gắng sưu tầm bài hay.

----------


## sangdv291

Bạn heocontotbung cố gắng suy nghĩ đi. Có lợi đấy. Chúc thành công.!!!!!!!!!!

----------


## hoanganh1

Mình giải bài này cho các bạn thích PC tham khảo: 
Cho bàn cờ có n x n ô. Một quân Mã được phép đi theo luật cờ vua,đầu tiên được đặt ở ô có tọa độ (x,y).Lập chương trình tìm tất cả các đường đi của quân Mã sao cho mọi ô trên bàn cờ đều được quân Mã đi qua đúng 1 lần.
[ code]
Uses Crt;
Const MaxN=10;
Var N, K:Byte;
A, B :Array[1..MaxN] of Byte;
Dem: Longint;
{=================================================  ===============}
Procedure input;
Begin
Clrscr;
Repeat
Write('Nhap 2 so N, K (N>=K) ');
Readln(N,K);
Until (N>=K) and (K>0);
Fillchar (A,sizeof(A),0);
B:=A; Dem:=0;
End;
{=================================================  }
Procedure Print;
Var i:Byte;
Begin
Inc(dem);
Write('Chinh hop thu ',dem,': ');
For i:=1 to K do Write(A_),' '); 
Writeln;
End;
{============================================}
Procedure Find(m: Byte);
Var i:Byte;
Begin
If m>k then Print
Else 
Begin
For i:=1 to N do
If B = 0 then 
Begin
B:=m;
A[m]:=i;
Find(m+1);
B:=0;
A[m]:=0; {Quay lui}
End;
End;
End;
{===============================================}
Begin
Input; 
Find(1);
If dem=0 then Writeln('Vo nghiem')
Else Writeln(' Co tat ca ',dem,' chinh hop ',N,' chap ',K);
Readln
End.
[/code]_

----------


## tungcar2084

> Bài hay nè:
> Các hoán vị của n chữ cái hoa Tiếng anh A..Z được sắp tăng theo trật tự từ điển và được viết liền nhau để tạo thành một dãy kí tự duy nhất. Xác định kí tự thứ m trong dãy, gọi là kí tự c.
> Dữ liệu vào: Cho trong File vb mang tên HV.INP, gồm 1 dòng chứa 2 số nguyên n và m. Các số trên cùng dòng cách nhau bởi 1 dấu cách. 1<=n<=10, 1<=m<=n*n!
> Dữ liệu ra: vào file văn bản mang trên HV.OUT, gồm 1 dòng cho biết kí tự thứ m trong dãy
> Thí dụ:
> HV.INP HV.OUT
> 4 15 D
> Trong thí dụ trên, do n = 4 nên ta có dãy: ABCDABCDABCDABCD.... và do đó kí tự thứ 15 trong dãy sẽ là D.
> Cố gắng sưu tầm bài hay.


bác có nhầm không, ký tự thứ 15 là C mà @__@
thuật toán đơn giản thôi: lấy m mod n = i, i là thứ tự trong dãy ABC....

----------


## canhosaigon

Cho xin lỗi nha,
Trong thí dụ trên, do n = 4 nên ta có dãy: ABCDABDCACBDACDBAD... và do đó kí tự thứ 15 trong dãy sẽ là: D

----------


## viettopcare

Sao ko thấy ai bình luận thế nhỉ ? Hay !

----------


## ngoctran89

đúng đấy sao ít thấy mem nào yêu pascal bình luận, nếu có thì mình sẽ cố gắng tìm thêm bài tập hay và khó để đăng.

----------


## clean190914

> Bài hay nè:
> Các hoán vị của n chữ cái hoa Tiếng anh A..Z được sắp tăng theo trật tự từ điển và được viết liền nhau để tạo thành một dãy kí tự duy nhất. Xác định kí tự thứ m trong dãy, gọi là kí tự c.
> Dữ liệu vào: Cho trong File vb mang tên HV.INP, gồm 1 dòng chứa 2 số nguyên n và m. Các số trên cùng dòng cách nhau bởi 1 dấu cách. 1<=n<=10, 1<=m<=n*n!
> Dữ liệu ra: vào file văn bản mang trên HV.OUT, gồm 1 dòng cho biết kí tự thứ m trong dãy
> Thí dụ:
> HV.INP HV.OUT
> 4 15 D
> Trong thí dụ trên, do n = 4 nên ta có dãy: ABCDABCDABCDABCD.... và do đó kí tự thứ 15 trong dãy sẽ là D.
> Cố gắng sưu tầm bài hay.


mình xài quay lui [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG] bài giải của mình đây, bạn xem có đúng ko nhé ( :a: test thì thấy đúng rùi đó):



```
Var m,n,dem,k:integer;
    x:array[1..10] of integer;
    c:array[1..10] of boolean;
 
Procedure try(i:integer);
Var a,j:integer;
Begin
        For j:=1 to n do
        If c[j] then
        Begin
                x[i]:=j;
                If i=n then inc(dem)
                else
                Begin
                   c[j]:=false;
                   try(i+1);
                   c[j]:=true;
                End;
                If dem=k then
                 Begin
                   a:=m mod n;
                   If a=0 then a:=n;
                   Writeln(chr(x[a]+64));
                   Readln;
                   halt;
                End;
        End;
End;
 
Begin
        Write('Nhap n,m:');Readln(n,m);
        fillchar(x,sizeof(x),0);
        fillchar(c,sizeof(c),true);
        dem:=0;
        If m mod n = 0 then k:=m div n
        else k:=(m div n)+1;
        try(1);
End.
```

----------


## thanhdung0906

> Thêm một bài hay nữa nè:
> Cho một biểu thức toán học chỉ gồm các số, khoảng trắng, dấu + - * / hoặc các cặp dấu ngoặc ()
> Lập chương trình tính ra giá trị của chuỗi đã nhập và in ra kết quả.


lập trình cái nào cũng giống như viết trình giả lập máy tính CASIO FX500MS [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]

----------


## paliauthentic

Bạn thử cặp số 10 151200 và 10 725760 và 10 36288000 theo mình còn xíu nữa là ok rồi. Cho bạn lời khen và 10 điểm. Chúc bạn thành công.

----------


## dtbaongoc0

Giải bài dãy số hạnh phúc:


```
uses crt;
Var n, dem: word;
day: array[1..10000] of word;
{=================}
Procedure Nhap;
Begin
Clrscr;
Write('Nhap vao so tu nhien n = '); Readln(n);
if n = 0 then
Begin
Writeln('Day so hanh phuc tim duoc la 0'); 
Readln; halt;
end;
dem:=1; day[dem]:=n;
end;
{============}
Function nto(i:word):boolean;
Var u:word;
Begin
nto:=True;
for u:=2 to Trunc(sqrt(i)) do
if i mod u = 0 then
begin
nto:=false;
exit;
end;
end;
{==========}
procedure xuly;
var i, so, d:word;
Begin
For so:=n-1 downto 1 do
Begin
d:=dem;
if nto(so) then
Begin
Inc(dem); day[dem]:=so;
end
else
for i:=1 to d do
if day[i] mod so = 0 then 
begin
inc(dem); day[dem]:=so; i:=d;
end;
end;
end;
{==========}
procedure viet;
var i:word;
Begin
Writeln(' Day so hanh phuc tim duoc la:');
For i:=1 to dem do Write(day[i]:5);
Readln
End;
{=========}
Begin
nhap; xuly; viet;
end.
```

Mong các bạn cùng hưởng ứng. Vì nền tin học của nước nhà. Chúc bạn [you] thành công.

----------


## Lucian

*Mình có bài này hay*




> For so:=n-1 downto 1 do
> Begin
> d:=dem;
> if nto(so) then
> Begin
> Inc(dem); day[dem]:=so;
> end
> else
> for i:=1 to d do
> ...


_


Anh HSG ơi, em nghĩ là số thứ i trong dãy hoặc là số nguyên tố, hoặc là ước của n luôn, nên không cần phải thêm vòng lặp for i thứ 2 đâu ạ!_

----------

