Bài tập chương 3

Bài 1 : Các miền trên bảng

Cho một bảng chữ nhật chia thành MxN ô vuông (M dòng, N cột). Mỗi ô vuông ghi một số nguyên dương (trong khoảng từ 1 đến 255). Một miền của bảng là tập hợp tất cả các ô có cùng giá trị số sao cho chúng đi được sang nhau bằng cách đi qua các ô có chung cạnh và có cùng giá trị số đang xét. Địa chỉ của một miền là tọa độ [dòng, cột] của ô đầu tiên thuộc miền theo thứ tự duyệt từ trái sang phải và từ trên xuống dưới. Diện tích của một miền là số ô thuộc miền đó. Thí dụ bảng:

có 4 miền, miền tô màu xám (giá trị các ô là 2) có địa chỉ [1, 3] và diện tích là 7.

Cần xác định:

Số miền của mảng.

Miền có diện tích lớn nhất (chỉ rõ giá trị diện tích và địa chỉ của miền).

Dữ liệu vào cho trong file văn bản (tên file đọc từ bàn phím) có dạng:

M N

A[1, 1] A[1, 2]...A[1, N]

A[2, 1] A[2, 2]...A[2, N]

......................................

A[M, 1] A[M, 2]...A[M, N]

trong đó A[i, j] là giá trị số của ô [i, j], các số trên cùng một dòng ghi cách nhau ít nhất một dấu trắng.

Yêu cầu chương trình thiết kế theo menu gồm các chức năng:

Đọc dữ liệu vào từ file

Giải bài toán bằng tìm kiếm theo chiều rộng.

Giải bài toán bằng tìm kiếm theo chiều sâu.

Kết thúc chương trình.

Kết quả tìm đuợc đưa ra màn hình.

Giới hạn kích thước: M, N <= 100.

Bài 2.

Cho một mạng N (N <= 20) máy tính được đánh số từ 1 đến N. Sơ đồ mạng được cho bởi hệ gồm M kênh (đoạn) nối trực tiếp giữa một số cặp máy trong mạng, m kênh tương ứng với m cặp. Cho biết chi phí truyền 1 đơn vị thông tin theo mỗi kênh của mạng.

Người ta cần chuyển một bức thông điệp từ máy s đến máy t. Để đảm bảo an toàn, người ta chuyển bức thông điện này theo hai đường truyền tin khác nhau (tức không có kênh nào) của mạng được sử dụng trong cả hai đường truyền tin; cho phép hai đường truyền tin cùng đi qua một số máy tính). Chi phí của một đường truyền được hiểu là tổng chi phí trên các kênh của nó. Đơn giá đường truyền từ máy s sang máy t được tính như sau:

Với hai máy s và t, cùng bức thông điệp có độ dài là 1 đơn vị thông tin, đơn giá truyền cho cặp (s, t) được tính bằng tổng chi phí chuyển thông điệp an toàn (bằng tổng chi phí của hai đường truyền tin) là nhỏ nhất.

Người ta mong muốn mạng máy tính (mạng truyền tin nói trên thỏa mãn tính chất an toàn theo nghĩa là từ một máy bất kỳ luôn truyền được (một cách an toàn) thông điệp tới một máy bất kỳ khác. Khi một mạng an toàn, người ta tính được đơn giá của mạng là tổng đơn giá mọi đường truyền từ một máy bất kỳ tới một máy bất kỳ khác.

Ma trận đơn giá của mạng là mảng hai chiều A có N dòng và N cột, mà giá trị phần tử A[i, j] chính là đơn giá từ máy i sang máy j.

Bài 3 :

Một khóa học gồm N môn học, môn học i phải học trong ti ngày. Giữa các môn học có mối quan hệ trước/sau: có môn học chỉ học được sau khi đã học một số môn học khác. Mối quan hệ đó được thể hiện bởi một mảng hai chiều A[i, j]; i, j = 1, …, N trong đó A[i, j] = 1/0 và A[i, i] bằng 0 với mọi i, A[i,j] = 1 khi và chỉ khi môn học i phải được dạy xong trước khi học môn j (ngày kết thúc môn i phải trứơc ngày bắt đầu môn j). Môn học i phải dạy trước môn học j nếu có một dãy môn học i1, i2, …, ik sao cho a[it, it+1] = 1, 1 <= t <= k-1, i1=i và ik=j. Nếu có một nhóm các môn học từng đôi một không có quan hệ trước/sau thì trong mỗi ngày, về nguyên tắc, ta có thể học đồng thời tất cả những môn học này (nếu không vi phạm quan hệ với các môn học khác). Mảng A[i, j] được gọi là bế tắc nếu có một dãy các môn học i1, i2,…, ik, k > 1, mà môn i1 phải dạy trước môn i2, môn i2 phải dạy trước môn i3, …, môn ik-1 phải dạy trước môn ik, môn ik phải dạy trước môn i1.

Hãy viết chương trình với tên KT3.PAS làm các việc sau:

Hãy xét xem mảng A có bế tắc hay không.

Nếu mảng A không bế tắc, hãy tính xem khóa học có thể kết thúc trong thời gian nhanh nhất là bao nhiêu ngày.

Theo các học bảo đảm thời gian hoàn thành ngắn nhất ở câu 2, hãy tính xem một học sinh trong quá trình học phải học đồng thời trong một ngày nhiều nhất bao nhiêu môn.

Dữ liệu vào được cho bởi file text có tên MH.DAT trong đó số N ghi ở dòng thứ nhất, trong nhóm N dòng tiếp theo, dòng thứ i ghi N số A[i, 1], …, A[i, N] dòng cuối cùng ghi N số nguyên dượng ti không lớn hơn 30, 1 <= i <= N; N <= 30.

Kết quả ghi ra file TKB.DAT như sau: dòng thứ nhất ghi số 1/0 tùy theo mảng A bế tắc / không bế tắc. Nếu dòng thứ nhất ghi số 0, ta mới ghi tiếp kết quả câu 2 và 3.

Kết quả câu 2 ghi tiếp vào file TKB.DAT N+1 dòng như sau: dòng dầu ghi số T là số ngày tối thiểu có thể hoàn thành khóa học, tiếp theo là N dòng trong đó dòng thứ i ghi 2 số X, Y với ý nghĩa môn học thứ i học từ ngày thứ X đến ngày thứ Y (chú ý rằngY–X=ti–1).

Kết quả câu 3 ghi tiếp vào file TKB.DAT như sau: dòng thứ nhất ghi 2 số Z, W với ý nghĩa trong ngày Z phải học W môn (W là số nhiều nhất các môn học phải học đồng thời trong một ngày), tiếp theo là một dòng ghi tên các môn học phải học đồng thời trong ngày Z.

Trong các câu 2 và 3, có thể có nhiều lời giải tương đương chỉ cầu đưa ra một lời giải.

Ví dụ 1

Ví dụ 2

Bài 4: Hình vuông Latinh

Hình vuông la tinh cấp 4 là ma trận vuông kích thước 4x4 mà mỗi dòng và mỗi cột của nó đều là một hoán vị của các chữ cái A, B, C, D. Hai hình vuông la tinh được gọi là tương đương nếu từ hình này ta có thể thu được hình kia nhờ sử dụng các phép biến đổi sau: 1) đổi chỗ hai dòng; 2) đổi chỗ hai cột; 3) đổi tên hai chữ cái.

Ví dụ: Hai hình vuông la tinh

          A B C D               A B C D

θ 1 = B D A C      θ 2 = B C D A

          C A D B               C D A B

          D C B A               D A B C

là tương đương, bởi vì đổi chỗ dòng 3 và 4 của θ 1 ta thu được

A B C D

B D A C

 D C B A

C A D B

tiếp đến đổi chỗ cột 3 và 4 ta thu được

A B D C

B D C A

D C A B

C A B D

cuối cùng, đổi tên hai chữ C và D cho nhau (nghĩa là thay C bởi D và thay D bởi C) ta thu được θ 2.

Yêu cầu: Cho θ 1, θ 2 là hai hình vuông la tinh cấp 4. Hãy xác định xem hai hình vuông đã cho có tương đương hay không?

Dữ liệu vào: file văn bản LATIN.INP có cấu trúc như sau:

4 dòng đầu tiên chức các dòng của hình vuông θ 1;

4 dòng tiếp theo chứa các dòng của hình vuông θ 2;

(các phần tử trong một dòng được viết liền nhau);

Kết quả: Ghi ra file văn bản có tên LATIN.OUT dưới dạng sau:

Dòng đầu tiên ghi số lượng phép biến đổi k (k=0, nếu hai hình vuông là không tương đương);

Các dòng tiếp theo ghi dãy các phép biến đổi cần áp dụng để từ θ 1 thu được θ 2; thông tin về một phép biến đổi bao gồm: chỉ số của phép biến đổi, chỉ số hai dòng (cột) cần đổi chỗ hoặc hai chữ cái cần đổi tên cho nhau.

Ví dụ: các file dữ liệu và kết quả có thể:

 

Bài 5: Truyền tin trên mạng

Có một nhóm gồm N lập trình viên được đánh số từ 1 tới N, một số người trong họ có biết địa chỉ email của nhau. Khi biết một thông tin nào mới họ gửi thông tin đó cho nhau. Bạn là một người rất quan trọng và bạn biết tất cả các mối quan hệ của họ cũng như bạn có một thông tin rất đặc biệt mà muốn cho tất cả họ đều biết. Hãy lập trình chỉ ra một số ít nhất các lập trình viên cần cho họ biết thông tin sao cho những người đó có thể thông báo cho tất cả những người còn lại thông tin của bạn.

Dữ liệu cho trong file văn bản với tên INFOR.INP trong đó dòng đầu chức số N (N <= 1000), dòng thứ I trong N dòng tiếp theo chứa danh sách các lập trình viên mà người I biết địa chỉ email của họ. Nếu người thứ I không biết địa chỉ của bất cứ ai thì dòng này là dòng trống.

Kết quả ghi ra file văn bản với tên INFOR.OUT trong đó dòng đầu ghi số K là số người cần cho họ biết thông tin. Dòng thứ hai ghi ra chỉ số của những người đó.

Ví dụ:

Bài 6: Mọi con đường đều về 0

Một số tự nhiên dương N đều tìm được 2 số nguyên dương x <= y sao cho N=xy. Với cách phân tích này ta sẽ hình thành ra số tự nhhiên mới N1=(x-1)(y+1). Số này có thể dương hoặc bằng 0. Nếu nó dương ta có thể chọn một cách phân tích nào đó và lặp lại những thao tác trên.

Bài toán: Với số tự nhiên N (N <= 10000) cho trước, hãy cho biết ta có thể sinh ra được những số nào.

Dữ liệuvào cho trong file text với tên VE0.INP trong đó chứa một số duy nhất N.

Kết quả ghi ra file text VE0.OUT trong đó liệt kê ra tất cả các số tìm được theo thứ tự tăng dần.

Ví dụ:

Bài 7: Chuyển bi

Cậu bé vẽ N (N<=100) vòng tròn đánh số từ 1 tới N và tô màu các vòng tròn đó (có thể có các vòng tròn có màu giống nhau) sau đó nối từng cặp lại bằng các cung định hướng, mỗi cung có một màu nhất định. Các màu của cung và của vòng tròn được đánh số từ 1 đến 100.

Cậu bé chọn 3 số nguyên khác nhau L, K và Q nằm trong phạm vi từ 1 tới N đặt vào trong các vòng tròn số L và K mỗi vòng tròn một hòn bi sau đó bắt đầu di chuyển theo quy tắc sau :

Bi chỉ được chuyển theo cung có màu trùng với màu vòng tròn chứa bi thứ 2

Bi chỉ được chuyển theo chiều cung

Hai viên bi không được đồng thời ở cùng một vòng tròn

Không nhất thiết phải di chuyển lần lượt các viên bi.

Quá trình di chuyển kết thúc khi một trong hai viên bi tới vòng tròn Q

Hãy lập trình xác định cách di chuyển để chấm dứt quá trình sau một số ít nhất các bước chuyển.

Dữ liệu vào: file BI.INP

Dòng đầu : 4 số nguyên N L K Q

Dòng thứ 2 : N số nguyên C1, C2, …, Cn, Ci là màu vòng tròn i.

Dòng thứ 3 : Số nguyên M (0<=M<=10000)

M dòng sau : mỗi dòng 3 số nguyên Ai,Bi,Di xác định cung màu Di đi từ vòng tròn Ai tới vòng tròn Bi.

Các số trên một dòng cách nhau một dấu cách.

Kết quả: đưa ra file BI.OUT

Dòng đầu : CO hoặc KHONG cho biết quá trình có kết thúc được hay không.

Nếu dòng đầu là CO thì dòng 2 chứa số nguyên xác định số bước di chuyển tối thiểu.

Ví dụ :

BI.INP

5 3 4 1

2 3 2 1 4

8

2 1 2

4 1 5

4 5 2

5 1 3

3 2 2

2 3 4

5 3 1

3 5 1

BI.OUT

CO

3

Bài 8: Gỡ mìn

Cho bảng hình chữ nhật kích thước MxN (M số dòng, N số cột) ô vuông. Mỗi ô mang giá trị 0 hoặc 1, nếu ô (i, j) có mìn A[i, j] = 1, ngược lại thì A[i, j] = 0.

(a) Một người xuất phát từ ô (X1, Y1) không có mìn, kiểm tra xem người này có thể di chuyển đến ô (X2, Y2) được hay không bằng cách di chuyển sang những ô chung cạnh không có mìn.

(b) Nếu kết quả câu a là người đó không thể di chuyển đến (X2, Y2) được thì hãy chỉ ra cách gỡ ít nhất những quả mìn để anh ta có thể di chuyển đến (X2, Y2).

Dữ liệu vào: file text GOMIN.INP

Dòng đầu là 6 số M, N, X1, Y1, X2, Y2 cách nhau bởi khoảng trắng.M dòng tiếp theo, mỗi dòng gồm N số 0/1 tương ứng có mìn hoặc không có mìn, mỗi số cách nhau bởi khoảng trắng.

Dữ liệu ra: file text GOMIN.OUT

Dòng đầu chứa số 0/1 tương ứng với đi được / không đi được.

Nếu là không đi được thì dòng thứ hai là số K tương ứng với số mìn ít nhất cần phải gỡ.

Nếu có số K ở dòng thứ hai thì K dòng tiếp theo, mỗi dòng i gồm 2 số tương ứng với chỉ số cột và chỉ số dòng của ô thứ i cần phải gỡ mìn.

Bài 9:

Cho một đồ thị vô hướng G gồm N đỉnh xác định bởi ma trận kề A[N, N] trong đó A[i, j] = 1 nếu cạnh (i, j) ∈ G và A[i, j] = 0 nếu (i, j) ∉ G. Hãy cài đặt thuật toán và viết chương trình xác định tính liên thông của đồ thị G. Nếu G không liên thông, hãy cho biết số thành phần liên thông trong G và liệt kê cụ thể các thành phần liên thông này.

Bài 10: Tìm kiếm

Một vùng đất hình chữ nhật được chia thành các mảnh đất theo dạng ô lưới MxN. Mỗi ô có thể trồng trọt được sẽ được đánh dấu là 1, các ô còn lại được đánh dấu là 0. Hai ô gọi là kế nhau nếu chúng có chung 1 cạnh (ngang hay dọc). Một khu đất trồng là tập hợp các ô có thể trồng trọt được nằm kề nhau lớn nhất nghĩa là các khu đất trồng phân cách nhau bởi các ô được đánh dấu là 0. Hãy xác định số lượng và chỉ rõ cụ thể các khu đất trồng nằm trong vùng đất. Giả thiết rằng số lượng các ô khá lớn.