PDA

View Full Version : Một số bài toán khá ... khoai



FinderDev
10-10-2004, 15:08
Tui có một số bài toán như sau , nếu các bác rỗi rãi xin cùng tham gia :

1) Phân tích một số ra tổng của một số số , tổng nào có tích các số lớn nhất và ít số số hạng nhất thì lấy , thí dụ : 7 = 3 + 4 = 2 + 2 +3 thì ta lấy 3 + 4.

2) Cho mặt phẳng tọa độ đề các xOy , Nhập vào N điểm ( n<=10000 ) , các điểm có tọa độ tối đa là (10^9,10^9) , âm dương tùy ý các bác , tìm một đường thẳng chia đôi mặt phẳng làm hai phần sao cho số điểm ở cả hai nửa đều bằng nhau .

3) Nhập vào một số thực R ( tùy ý nhưng không nên to quá ) , tìm số k và biểu diễn R dưới dạng :
a[1]+.........+a[k]=a[1]*........*a[k]=R
Trong đó các A[i] là tùy ý và a[i] là số thực không vượt quá 4.

Bài 1 và bài 2 tui đã làm tàm tạm nhưng mà thời gian chạy hơi lâu , nhất là bài hai , còn bài ba thì , tui đang chết ngắc đây , huynh nào cao tay giúp cái .

t2l3k4
10-10-2004, 21:13
1) Vậy nếu 100=50+50=20+40+40 thì mình chọn cái nào anh?
Nếu chọn 50,50 thì bài này em có nhận xét sau:
+ Luôn tách ra thành hai số
+ Khoảng cách giữa hai số này bé nhất ( cái này chứng minh giống như chứng minh Tổng Tích Max bằng Cauchy )

Rikku
10-10-2004, 21:17
Bài 3 tui làm rùi, dùng định lý Viet, nhưng làm lâu wá nên.. quên rùi, đợi vài hôm tui post cho, còn bài 1 hình như có 1 bài toán tương tự, số đó để phân tích thỏa mãn thì sẽ có dạng :3+3+3+3+3+... không được có số hạng vượt quá 5,.. nói vậy chắc bạn làm được rùi.

Rikku
10-10-2004, 22:41
Tóm lại bài 1 thì làm như sau:
Nếu n chia hết cho 3 -> 3+3+3+3+..+3
nếu dư 1 ->3+3+3+3+..+3+4
nếu dư 2 ->3+3+3+...+2

Bạn dễ dàng cm dãy không được có số lớn hơn 4 và có quá 3 số 2 vì ta sẽ có cách tìm 1 dãy khác có tích lớn hơn. (5=3+2, 2+2+2=3+3,..)

Bài 3 (nhớ mang máng) :vì có vô số cách chọn nên ta sẽ quy định 1 cách chọn như sau
đầu tiên chia dãy a1,..ak thành 2 phần với mỗi phần tìm được lại chia tiếp, cứ như vậy.để chia ta áp dụng đl Viet vào pt x^2-rx+r=0:
nghiệm 1 là phần 1, nghiệm 2 là phần 2.

Bài 2 :pó tay

dhlong
11-10-2004, 18:46
Bài 2: lấy 1điểm p bất kỳ làm mốc, sắp xếp dãy các điểm đó theo hệ số góc đường thẳng nối điểm đó với p. Sau khi sắp xếp, lấy điểm ở khoảng giữa của dãy đó (gọi là q). Đường thảng qua p và q (tuỳ theo số điểm chẵn hay lẻ, đường thẳng sẽ đi qua điểm q hoặc hơi lệch lệch qua q 1 xíu) là đường thẳng cần tìm.
Sắp xếp mất NlogN, chắc bài toán cũng chỉ NlogN thôi.

freegianghu
11-10-2004, 19:59
Bài 2: lấy 1điểm p bất kỳ làm mốc, sắp xếp dãy các điểm đó theo hệ số góc đường thẳng nối điểm đó với p. Sau khi sắp xếp, lấy điểm ở khoảng giữa của dãy đó (gọi là q). Đường thảng qua p và q (tuỳ theo số điểm chẵn hay lẻ, đường thẳng sẽ đi qua điểm q hoặc hơi lệch lệch qua q 1 xíu) là đường thẳng cần tìm.
Sắp xếp mất NlogN, chắc bài toán cũng chỉ NlogN thôi.

Bạn thử hình dung có n-3 điểm thẳng hàng (bao gồm cả p), hai điểm nằm một phía, điểm còn lại nằm phía kia của đường thẳng rồi lệch một chút xíu coi?

sai "1 xíu" đi một tỷ dặm đấy nhỉ :)
GiangHu

FinderDev
12-10-2004, 00:03
1) Vậy nếu 100=50+50=20+40+40 thì mình chọn cái nào anh?
Nếu chọn 50,50 thì bài này em có nhận xét sau:
+ Luôn tách ra thành hai số
+ Khoảng cách giữa hai số này bé nhất ( cái này chứng minh giống như chứng minh Tổng Tích Max bằng Cauchy )

Còn tùy thui , không hẳn trường hợp nào cũng vậy cả .


Tóm lại bài 1 thì làm như sau:
Nếu n chia hết cho 3 -> 3+3+3+3+..+3
nếu dư 1 ->3+3+3+3+..+3+4
nếu dư 2 ->3+3+3+...+2

Bạn dễ dàng cm dãy không được có số lớn hơn 4 và có quá 3 số 2 vì ta sẽ có cách tìm 1 dãy khác có tích lớn hơn. (5=3+2, 2+2+2=3+3,..)

Bài 3 (nhớ mang máng) :vì có vô số cách chọn nên ta sẽ quy định 1 cách chọn như sau
đầu tiên chia dãy a1,..ak thành 2 phần với mỗi phần tìm được lại chia tiếp, cứ như vậy.để chia ta áp dụng đl Viet vào pt x^2-rx+r=0:
nghiệm 1 là phần 1, nghiệm 2 là phần 2.


Bài 2 tui cũng làm như bạn đã nói còn bài 3 thì phải về xem sao đã .


Bài 2: lấy 1điểm p bất kỳ làm mốc, sắp xếp dãy các điểm đó theo hệ số góc đường thẳng nối điểm đó với p. Sau khi sắp xếp, lấy điểm ở khoảng giữa của dãy đó (gọi là q). Đường thảng qua p và q (tuỳ theo số điểm chẵn hay lẻ, đường thẳng sẽ đi qua điểm q hoặc hơi lệch lệch qua q 1 xíu) là đường thẳng cần tìm.
Sắp xếp mất NlogN, chắc bài toán cũng chỉ NlogN thôi.

Cách này nghe rất hợp lý nhưng vấn đề ở chỗ " lấy điểm ở khoảng giữa là thế nào vậy "

Rikku
12-10-2004, 13:55
Tui không nghĩ là cách của ông dhlong chính xác đâu, có lẽ phải duyệt từng điểm sau khi sort.

FinderDev
14-10-2004, 22:20
Nghĩa là thế nào ?

Rikku
15-10-2004, 21:54
Argh, nếu duyệt từng điểm thì lên đến N^2*logN mất. Phải nghĩ cách khác thôi.

FinderDev
15-10-2004, 22:20
Nghe có vẻ khó khăn quá .

heroes_power
16-10-2004, 08:40
mình mong là các bạn hãy post đoạn mã lên luôn nha chứ mọi người nói như vậy chắc gì những người trong idễn đàn này đã hiểu đâu nha
nếu được cả 3 bài thì càng tốt
Mong sao các bạn post lên sớm sớm nha

Rikku
16-10-2004, 14:02
Post mã lên làm gì, chỉ cần thuật toán thôi, mỗi người một cách viết code nên đọc code khó hiểu lắm.

giam doc KANG
16-10-2004, 18:31
anh rikku cho hỏi về định lý viet là định lý gì đấy? ở sách nào.chỉ giáo hộ nhé.thanks

FinderDev
17-10-2004, 23:31
bạn học lớp mấy rùi , chắc mới lớp tám nên chưa biết định lý viét cũng phải thui

Tui có thêm bài mới nè các bác làm mau cho nóng hổi :

Cho n số hạng ( n <=100 , A[i] <=200) , tìm cách chia mảng trên thành hai phần sao cho tổng của 2 phần chêch lệch nhau ít nhất .

VD : 1 2 3 4 5 thì chia thành 2 nhóm :
1) 1 2 5 = 8
2) 3 4 = 7
--> chênh lệch là 1.

Rikku
18-10-2004, 22:01
Duyệt trâu, duyệt trâu, có 2^100 thôi mà :D.

Rikku
19-10-2004, 12:07
Hê hê, quy hoạch động.Trước tiên phải làm bài này đã, tìm cách xếp để được tổng là M từ dãy ban đầu.Mất N^2 sau khi đó ta tìm kiếm nhị phân M lớn nhất có thể mất thêm logN nữa.Bài này giải với thuật toán ~N^2.

FinderDev
22-10-2004, 23:29
oái đây chỉ là bài xếp kẹo sao bác làm trâu thế .

aiza
23-10-2004, 08:32
bạn học lớp mấy rùi , chắc mới lớp tám nên chưa biết định lý viét cũng phải thui

Tui có thêm bài mới nè các bác làm mau cho nóng hổi :

Cho n số hạng ( n <=100 , A[i] <=200) , tìm cách chia mảng trên thành hai phần sao cho tổng của 2 phần chêch lệch nhau ít nhất .

VD : 1 2 3 4 5 thì chia thành 2 nhóm :
1) 1 2 5 = 8
2) 3 4 = 7
--> chênh lệch là 1.

- Tạo hai mảng đích X, Y
- Sắp xếp A[i] theo thứ tự giảm dần
- For i:=1 to N do
if (sum(X) < sum(Y)) then
X := X + A[i]
else
Y := Y + A[i]

Rikku
23-10-2004, 15:14
- Tạo hai mảng đích X, Y
- Sắp xếp A[i] theo thứ tự giảm dần
- For i:=1 to N do
if (sum(X) < sum(Y)) then
X := X + A[i]
else
Y := Y + A[i]

Vớ vẩn, ông thử test này đi: 4 4 4 3 3 3 3, ra bao nhiêu nào????? :)

freegianghu
24-10-2004, 15:16
bạn học lớp mấy rùi , chắc mới lớp tám nên chưa biết định lý viét cũng phải thui

Tui có thêm bài mới nè các bác làm mau cho nóng hổi :

Cho n số hạng ( n <=100 , A[i] <=200) , tìm cách chia mảng trên thành hai phần sao cho tổng của 2 phần chêch lệch nhau ít nhất .

VD : 1 2 3 4 5 thì chia thành 2 nhóm :
1) 1 2 5 = 8
2) 3 4 = 7
--> chênh lệch là 1.

Hướng giải của tôi:
- Tính tổng của dẫy số chia 2 => target
- min = vô cùng
- sum[i] = 1*n[1] + 2*n[2] + .... + 200*n[200] (với n[i] chạy từ 0 đến n[i])
- nếu (sum[i] = target) -> in cách chia
- else nếu (|sum[i] - target| = min) -> gán lại min (lưu cách chia)
- Cuối cùng in cách chia




for i:= 1 to 200 do
heso[i] := 0;

for i:= 1 to N do
begin
heso[A[i]] := heso[A[i]] + 1; sum := sum + A[i];
end;

target = sum div 2 ;

=> to be continue...

Rikku
24-10-2004, 19:11
Hướng giải của tôi:
- Tính tổng của dẫy số chia 2 => target
- min = vô cùng
- sum[i] = 1*n[1] + 2*n[2] + .... + 200*n[200] (với n[i] chạy từ 0 đến n[i])
- nếu (sum[i] = target) -> in cách chia
- else nếu (|sum[i] - target| = min) -> gán lại min (lưu cách chia)
- Cuối cùng in cách chia




for i:= 1 to 200 do
heso[i] := 0;

for i:= 1 to N do
begin
heso[A[i]] := heso[A[i]] + 1; sum := sum + A[i];
end;

target = sum div 2 ;

=> to be continue...



Pác có chắc là đúng không, tui đọc chả hiểu gì cả
To FinderDev: bài này thầy tui đã dạy cách n^2 nên chắc chắn cách đó đúng.100^2 có đáng là bao mà ông bảo trâu? :)

freegianghu
24-10-2004, 20:36
Pác có chắc là đúng không, tui đọc chả hiểu gì cả

Nói thế này cho ông dễ hiểu: như dẫy của ông (4 4 4 3 3 3 3) đưa trên => 4*3 + 3*4



procedure Find(const total:integer, start:integer)
begin
if (start > Max) then
{return}

if (total = target) then
{in chuỗi}
else if (total > target)
{return}
else
begin
if (Min < (target-total))
Min := target-total;
for i := 0 to heso[start] do
Find(total+i*start, j);
end;
end;

for i:= 1 to 200 do
heso[i] := 0;

for i:= 1 to N do
begin
heso[A[i]] := heso[A[i]] + 1; sum := sum + A[i];
if (Max < A[i]) Max := A[i];
end;

target := sum div 2 ;

Find(0, 1);



Tôi chưa thử, có gì mong các bạn chỉ giáo!
Giang Hu

FinderDev
25-10-2004, 02:08
Các bác thử test thời gian chưa ?
Tui đề nghị cách này các bác cho ý kiến nhé
1) Chia mảng làm hai phần . Từng phần tử một , nếu phần tử này làm tổng mảng này lớn hơn tổng mảng kia thì chuyển sang mảng kia .
Cụ thể : 2 10 5 6 4 6
2 mảng là :
_ { 2 0 0 ... } { 0 0 0 ... }
--> { 2 0 0 } { 10 0 0 }
--> { 2 5 0 } { 10 0 0 }
--> { 2 5 0 } { 10 6 0 }
--> { 2 5 4 } { 10 6 0 }
--> { 2 5 4 } { 10 6 6 }
---> sai lệch là : 22 - 11 = 11

2) Quét toàn bộ hai mảng , chuyển dần từng phần tử cho đến khi chênh lệch nhỏ hơn chênh lệch lúc đầu thì đổi chỗ và ghi nhận chênh lệch mới .
{ 2 5 4 } { 10 6 6 }
2 --> 10 chênh là : (11 - 2 + 10 ) - ( 22 - 10 + 2 ) = 19 - 14 = 5 < 11 --> ghi nhận .
{ 10 5 4 } { 2 6 6 }
10 --> 6 chênh : 15 - 18 = |3| < 5 lấy .
{ 6 5 4 } { 2 10 6 }
6 --> 6 --> loại
5 --> 2 --> loại
5 --> 10 loại
5 --> 6 chênh : 16 - 17 = |1| ... OK rùi .
Vậy KQ : { 6 6 4 } { 2 10 5 }

freegianghu
25-10-2004, 03:26
Các bác thử test thời gian chưa ?
Tui đề nghị cách này các bác cho ý kiến nhé
1) Chia mảng làm hai phần . Từng phần tử một , nếu phần tử này làm tổng mảng này lớn hơn tổng mảng kia thì chuyển sang mảng kia .
Cụ thể : 2 10 5 6 4 6
2 mảng là :
_ { 2 0 0 ... } { 0 0 0 ... }
--> { 2 0 0 } { 10 0 0 }
--> { 2 5 0 } { 10 0 0 }
--> { 2 5 0 } { 10 6 0 }
--> { 2 5 4 } { 10 6 0 }
--> { 2 5 4 } { 10 6 6 }
---> sai lệch là : 22 - 11 = 11


Sao lại thế nhỉ? Tưởng "nếu phần tử này làm tổng mảng này lớn hơn tổng mảng kia thì chuyển sang mảng kia" thì nó phải là:


2 - {}
2 - 10
2 5 - 10
2 5 6 - 10
2 5 6 - 10 6
2 5 6 6 - 10 6

Thế này thì thuật toán không ổn vì bạn chỉ hoán đổi vị trí chứ không có chuyển sang "miễn phí"



2) Quét toàn bộ hai mảng , chuyển dần từng phần tử cho đến khi chênh lệch nhỏ hơn chênh lệch lúc đầu thì đổi chỗ và ghi nhận chênh lệch mới .
{ 2 5 4 } { 10 6 6 }
2 --> 10 chênh là : (11 - 2 + 10 ) - ( 22 - 10 + 2 ) = 19 - 14 = 5 < 11 --> ghi nhận .
{ 10 5 4 } { 2 6 6 }
10 --> 6 chênh : 15 - 18 = |3| < 5 lấy .
{ 6 5 4 } { 2 10 6 }
6 --> 6 --> loại
5 --> 2 --> loại
5 --> 10 loại
5 --> 6 chênh : 16 - 17 = |1| ... OK rùi .
Vậy KQ : { 6 6 4 } { 2 10 5 }




Thử kiểm tra với dẫy:
24 27 20 10 3 16 8 6
1 => 24,20,8,6 - 27,10,3,16 : lệch 2
2 => 24 <-> 27 => loại
..... loại hết

Trong khi KQ: (27+16)+(8+6) = (10+3)+(24+20)

FinderDev
28-10-2004, 20:05
Bạn hiểu nhầm ý tui rồi
Sau lần sắp xếp đầu dãy như sau :
{ 24 10 3 8 6 } { 27 20 16 } Lệch 12
Như vậy sẽ ra mà . ( Chắc thế )

flameresshin
22-12-2005, 18:08
Bài này gần giống bài toán chia kẹo
Các bạn có thể tìm trong báo tin học nhà trường số 4 năm 2002

Rikku
22-12-2005, 18:12
Từ tám hoánh nào rồi bác lôi lên >.<

quadaca
12-01-2006, 11:38
Chao cac ban !! Toi co 1 bài toán cũng rất khoai, giãi mãi mà chẳng hoàn chỉnh được, hoặc bị stask overflow hoac, hoặc tìm sót các đáp án... Tôi pót đề lên đây, các bạn nghiên cứu giúp nha. Pascal tôi ko rành lắm, nhất là dùng đệ quy, quay lui.

Đề: Cho bảng có 9 hàng và 9 cột(M:array[1..9,1..9] of byte). Hãy điền các số từ 1 đến 9 vào các ô sao cho ở mỗi hàng, mỗi cột ko có số trùng nhau.Tức là trong trong mỗi hàng mỗi cột, mỗi số(1..9) chỉ xuất hiện 1 lần.

http://qvquang.topcities.com/matrix.jpg

Nhu vay se co rất nhiều đáp án, người ta giới hạn các đáp án này bằng cách sẽ cho 1 vài số bắt buột vào bảng đã cho(các số màu đỏ). VD M[6,1]=5, M[7,1]=2, M[8,1]=9, M[4,2]=1....


các bạn giúp dùm nha.
Thank you !!

quadaca
16-01-2006, 09:30
Để thêm "khoai" minh xin bổ xung thêm: Chia bang ra lam chin phan, moi phan chin phan tu(1..3,1..3) phan tu. phan M1(1..3,1..3), M2(1..3,4..6), M3(1..3,7.9), M4(4..6,1..3)....

Trong moi phan con nay, cac so ko duoc trung nhau.

Master_Baby
17-01-2006, 06:47
Anh ơi, cái món này chẳng cần đệ quy hay quay lui gì gì đó cũng làm được mà. Chỉ có điều.... cách này cần kiên nhẫn một chút! Đơn giản nhất là cứ... FOR thôi. Thằng bạn em cũng làm bài này roài, nóbảo ngồi đợi khoảng... nửa tiếng!

quadaca
19-01-2006, 08:59
hi..hi... Đúng là đơn giản thật, cứ for.. for... mãi nghĩ thế nào cũng ra, lúc đầu tôi cũng nghĩ vậy, kệ,cần cù bù thông minh. Tất cả có 9*9=81 vòng lập for lòng vào nhau,chưa kể những vòng khác để kiểm tra điều kiện.... nhưng pascal hình như chỉ chấp nhận chưa tới 40 vòng for lòng nhau.

Mò mẫm pascal mãi ko ra, định dùng visual basic, khổ nỗi thằng basic bị hỏng mất nên xài tạm access, accsess basic cũng tuyệt lắm. Kết quả tuyệt vời, tìm tất tần tật. Dùng đệ quy, có thể viết lại bằng pascal đc đấy, nhưng sẽ dài lê thê lắm.

Cái này trên HHT gọi là sudoku gì đó, xuất phát từ Nhật Bản thì phải, một số báo khác cũng đố cái này.

Master_Baby
19-01-2006, 10:14
Uh, anh có thể cải tiến thêm để giải toàn bộ bài toán Sodoku được đấy! Tìm ra tất cả các trường hợp! Hì...

NothingToLost
01-03-2006, 21:27
Bài toán Sodoku này thì dùng đệ qui để vét tất các trường hợp à!
Thế này thì làm sao mà có thể viết trên Pascal được.
Chẳng hạn nếu nó cho 1 vài vị trí cho trước thì tịt luôn ,lấy thử tất cả các text của HHT xem.

Master_Baby
05-04-2006, 06:57
Vẫn làm được nếu đề ra là đúng, ko bị lệch số. Đơn giản là khi ông viết vào một bảng trống, ông phải lưu ra một mảng đúng ko? Sau đó để viết tiếp, ông phải đọc từ mảng đó đúng ko? Tương tự như thế, ở đây có cho thêm 1 hay 10 hay 100 số thì vẫn phải đọc mảng vào.

NothingToLost
05-04-2006, 14:37
Vẫn làm được nếu đề ra là đúng, ko bị lệch số. Đơn giản là khi ông viết vào một bảng trống, ông phải lưu ra một mảng đúng ko? Sau đó để viết tiếp, ông phải đọc từ mảng đó đúng ko? Tương tự như thế, ở đây có cho thêm 1 hay 10 hay 100 số thì vẫn phải đọc mảng vào.
Cái đó thì tui hiểu rùi. Thế nhưng ông định đệ qui kiểu gì?
Đệ qui từng phần tử trong mảng hay là sao? Nếu là thế thì tui báo trước với ông là không được đâu. Hay hôm nào đánh cái code lên đây cho mọi người cùng tham khảo.
À xin thưa thêm là đội tuyển quận ta có được 1 giải khuyến khích, thật là nhục nhã không còn gì để tả được nữa.(Trong đó em cũng không có giải!Thật là bất công!!!)

Master_Baby
06-04-2006, 06:34
Hừ, tui nghĩ ở đây có một sự nhầm lẫn nào đó.... Tên Dũng thủ quân nhà ta đáng lẽ ít nhất phải 16 - 17 điểm chứ. Ở nhà thầy mình đã tính vầy rồi, mà đó còn là bị trừ mấy điểm. Tên CaO thì chí ít cũng 15 điểm, vầy mà còn có 12 đạt khuyến khích. Chả hiểu mấy ông thành phố chấm kiểu gì. Hôm trước có thấy mấy ông đến kiểm tra phòng máy, tui thấy mấy tay này còn kém thầy mình mấy bậc. Nói khí không phải, tui thấy mấy thằng cha đó còn kém gã họ Ma tên Chí Định nhà ta. Vầy mà đòi chấm thi, tui chả hiểu luôn.
- Thân

NothingToLost
06-04-2006, 12:29
To Master_baby:
Hix!Theo nguồn tin ko xác định thì là chết tại do thay đổi biểu điểm, quân ta nhảy vào hai bài đầu 1 cách dễ dàng nhưng thấy bảo sau khi thay đổi biểu điểm thì diểm bài 1+2< điểm bài 3.Với lại đề thi quá dễ nên không thể hiện được trình độ của anh em quận mình, nếu mà đem bài vòng 5 cho bọn nó xem thì chẳng mấy đứa là được trên 10 điểm đâu!!!(Thế mà tui làm được 12 điểm)
Xin hỏi luôn nick I!M của ông là gì?

Rikku
06-04-2006, 14:30
Hạn chế chat chit nha mấy em lol

NothingToLost
06-04-2006, 17:04
Hạn chế chat chit nha mấy em lol
Anh Rikku ơi, thế có chỗ nào được phép nói về vấn đề này trên DDTH không ạ?


--------------------
Rikku: Có.

Master_Baby
07-04-2006, 06:48
Thì PM là được rồi. Không cần nói nhiều.

ureka
18-05-2006, 08:45
Sao không ai giải bài 2 hết???? Vậy để tui.
1.Nhập n điểm (x,y),
2. Sắp xếp theo thứ tự tăng dần của x hoặc y (giả định là x)
3. nếu n lẻ (n=2k+1), chọn điểm thứ k+1 có tọa độ [x(k+1),y(k+1)] làm điểm giữa, vẽ đường thẳng có phương trình x= x(k+1) sẽ có được 2 nửa mặt phẳng có số điểm bằng nhau.
4. Nếu n chẵn (n=2k), Chọn điểm phụ có tọa độ x={x(k)+x(k+1)}/2 làm điểm giữa, và .... tương tự.
Bài này quá dễ vậy mà hỏi làm gì vậy trời??????

Với trường hợp n lẻ, Nếu giả sử tại vị trí giữa x(k+1) có số điểm chẵn thì ta giải lại từ đầu theo tọa độ y. OK!

quadaca
19-05-2006, 12:26
Chao cac ban !! Toi co 1 bài toán cũng rất khoai, giãi mãi mà chẳng hoàn chỉnh được, hoặc bị stask overflow hoac, hoặc tìm sót các đáp án... Tôi pót đề lên đây, các bạn nghiên cứu giúp nha. Pascal tôi ko rành lắm, nhất là dùng đệ quy, quay lui.

Đề: Cho bảng có 9 hàng và 9 cột(M:array[1..9,1..9] of byte). Hãy điền các số từ 1 đến 9 vào các ô sao cho ở mỗi hàng, mỗi cột ko có số trùng nhau.Tức là trong trong mỗi hàng mỗi cột, mỗi số(1..9) chỉ xuất hiện 1 lần.



Nhu vay se co rất nhiều đáp án, người ta giới hạn các đáp án này bằng cách sẽ cho 1 vài số bắt buột vào bảng đã cho(các số màu đỏ). VD M[6,1]=5, M[7,1]=2, M[8,1]=9, M[4,2]=1....


các bạn giúp dùm nha.
Thank you !!


Để thêm "khoai" minh xin bổ xung thêm: Chia bang ra lam chin phan, moi phan chin phan tu(1..3,1..3) phan tu. phan M1(1..3,1..3), M2(1..3,4..6), M3(1..3,7.9), M4(4..6,1..3)....

Trong moi phan con nay, cac so ko duoc trung nhau.


Uh, anh có thể cải tiến thêm để giải toàn bộ bài toán Sodoku được đấy! Tìm ra tất cả các trường hợp! Hì...


Bài toán Sodoku này thì dùng đệ qui để vét tất các trường hợp à!
Thế này thì làm sao mà có thể viết trên Pascal được.
Chẳng hạn nếu nó cho 1 vài vị trí cho trước thì tịt luôn ,lấy thử tất cả các text của HHT xem.

Lâu quá không có lên đây, thấy bài viết mới nhiều quá, mà hình như chức năng thông báo qua mail các chủ đề mình theo dõi hình như ko active hay sao ấy.

Gửi các bạn bài giải của mình bằng access, phần code mình chỉ viết qua, chưa có thời gian xem lại để chỉnh sữa, nên dùng biến,hàm... hơi lộn xộn :yes:

Sao mình ko attach fil đc vậy , làm tới 5 lần, toàn báo fail

Gửi tạm vào đây vậy http://huongu.hollohost.com/sudoku.rar

Mình nhầm, là http://huongu.hollosite.com/sudoku.rả

Mình nhầm, là http://huongu.hollosite.com/sudoku.rar