bài tin học khó

V

vuhoanghaa224

[TẶNG BẠN] TRỌN BỘ Bí kíp học tốt 08 môn
Chắc suất Đại học top - Giữ chỗ ngay!!

ĐĂNG BÀI NGAY để cùng trao đổi với các thành viên siêu nhiệt tình & dễ thương trên diễn đàn.

đây là bài tin học nhưng khó quá ai giúp được em thi chỉ cho em không thì hỏi người khác cũng được.mà chi can giai bằng toán là tốt zồi.em có thể nhìn toán để viết trương trình.
bài tin như sau:
vườn trương la môt hình chữ nhật gồm 1 số khoảng trồng các loại cây khác nhau .no được mô ta la một lưới hình vuông sao cho mỗi ô của lưới được xem như chi có hai trang thái : diện tích trồng cây và không trồng cây.
người ta muốn quet vôi xung quanh cac bức tường rào của các khoảng đất(có nghĩa là phần bên các khoảng đất) nếu như bức tường rào là cạnh chung của 2 ô đất khác trạng thái( có nghĩa là 1 ô đất không trồng gì bên cạnh 1 ô đất trông cây thi quét vôi ở giữa 2 ô đất đó).Lập trình tính tổng chiều dài các cạnh quét vôi.
 
R

rocky1208

Tưởng tượng khu vườn gồm m hàng và n cột. mỗi ô có thể ở một trong 2 trạng thái "đã trồng cây" (màu đỏ) hoặc "còn trống" (màu xanh) như hình vẽ
Untitled.png


CÁC BIẾN CẦN TOÀN CỤC
m: số hàng của khu vườn
n: số cột của khu vườn
total: biến lưu giá trị chiều dài đã quét vôi. Ban đầu total = 0
garden[][]: mảng 2 chiều lưu tọa độ các ô trong vườn

Ý TƯỞNG
- duyệt qua từng hàng, trong mỗi hàng duyệt qua từng ô
- Các trường hợp
+ nếu ô ko phải hàng cuối, cột cuối: thì so sánh trạng thái của nó với ô kề phải và ô kề dưới.
nếu mỗi khi phát hiện khác thì tăng total lên 1

+ nếu là ô cuối cùng của hàng nhưng chưa là ô cuối của cột: thì so sanh trạng thái của nó với ô kề dưới
nếu phát hiện khác thì tăng total lên 1

+ nếu là ô cuối của cột nhưng chưa phải là ô cuối của hàng: thì so sánh trạng thái nó với ô kề phải
nếu phát hiện khác thì tăng total lên 1

+ nếu ko phải các trường hợp trên thì đây là ô cuối cùng của khu vườn (phía dưới, bên phải)
-> chẳng phải làm gì cả :)

Mã:
GIẢ LẬP CHƯƠNG TRÌNH (anh ko biết Pascal nên giả lập kiểu của ngôn ngữ C)

// hàm này là hàm quan trọng thực hiện tính toán và trả về số quãng đường cần quét vôi
function return_result(int m, int n)
{
  for(i = 1; i <= m-1; i++) // duyệt từ hàng 1 đến hàng sát cuối
  {
    // với mỗi hàng
    for(j=1; j<=n-1; j++) // duyệt từ ô đầu đến ô kề ô cuối trong hàng
    {
      if(is_different_x(i, j)) // nếu trạng thái ô (i, j) với ô kề phải nó khác nhau
        then total = total + 1;
      if(is_different_y(j, j) // nếu trạng thái ô (i, j) với ô kề dưới nó khác nhau
        then total = total + 1;
    }

    // ô cuối hàng ko chưa ko có ô kề phải nhưng nó có ô kề dưới nên cần so sánh
    if(is_different_y(i, n)) // nếu trạng thái ô cuối hàng với ô kề dưới nó khác nhau
      then total = total + 1;                    
  }// kết thúc for này ta đã quét vôi từ hàng 1 đến hàng m-1. Bây h quét nốt hàng cuối
  
  for(i = 0; i <= n-1; i++)
  {
    if(is_different_x(m, i) // nếu ô hiện tại và ô bên phải nó khác trạng thái nhau
      then total = total + 1; // tăng total lên 1
  }
  
  // cuối cùng thì trả về total
  return total;
}

CÁC HÀM CON

is_different_x (int i, int j) // kiểm tra theo chiều ngang (x), check xem ô hiện tại và ô kề phải với nó có trạng thái khác nhau không, nếu khác return true
{
  if (garden[i][j] == garden[i][j+1]) // nếu trạng thái giống nhau
    then return false;
  else                    // nếu khác nhau
    return true 
}

is_different_y (int i, int j) // kiểm tra theo chiều dọc (y), check xem ô hiện tại và ô kề dưới với nó có trạng thái khác nhau không, nếu khác return true
{
  if (garden[i][j] == garden[i+1][j]) // nếu trạng thái giống nhau
    then return false;
  else                    // nếu khác nhau
    return true 
}
 
Last edited by a moderator:
V

vuhoanghaa224

khó hiểu quá.em không wen C.ai co the giúp em ý tưởng rõ ràng hơn nữa dc ko.hay viết hản chương trình thì càng tốt.
thanks
 
Top Bottom