• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

[Cuộc thi] Kĩ năng lập trình - Kì 8: Bảo vệ báu vật 1

Các đề tài, cuộc thi, chủ đề chung của diễn đàn

Điều hành viên: Điều hành

Hình đại diện của người dùng
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

[Cuộc thi] Kĩ năng lập trình - Kì 8: Bảo vệ báu vật 1

Gửi bàigửi bởi vo_minhdat2007 » CN 19/12/2010 4:14 pm

Chào các bạn,

Nhằm giúp làm sôi động thêm diễn đàn và góp phần giúp các bạn nâng cao kỹ năng lập trình cũng như ôn tập và biết cách ứng dụng các kiến thức phổ thông cho các thành viên Câu lạc bộ VB, đặc biệt là VB.NET, Support Staff quyết định mở một loạt các chủ đề về lập trình để các thành viên có thể thi đấu với nhau.

Mục đích: Giúp thành viên vận dụng kiến thức phổ thông và lập trình của mình để giải quyết những vấn đề thực tế do đề bài đưa ra, từ đó nâng cao kĩ năng.

Đối tượng:
- Tất cả thành viên diễn đàn, trừ BQT (Admin, SMOD, MOD). Advance Member được quyền tham gia. Tuy nhiên, Admin, SMOD, MOD vẫn có thể gửi đáp án để làm cơ sở nhận xét. Advance Member được tham gia, nhưng nếu có kết quả hòa giữa Advance Member và thành viên thường thì sẽ ưu tiên cho thành viên thường.

Quy định:
- Các bài giải sẽ được gửi cho MOD vo_minhdat2007 bằng chức năng nhắn tin của diễn đàn hoặc email vo_minhdat2007@yahoo.com.vn . Mục đích là để các bạn tự suy nghĩ ra cách giải tốt nhất đối với mình.
- Nếu kì có thêm gợi ý bổ sung sau vài ngày, các bài gửi sau khi bổ sung gợi ý chỉ ghi được tối đa 9/10 điểm.
- Sau vài ngày, MOD sẽ đưa các bài giải của các bạn lên và nhận xét, chấm điểm và xếp hạng. Các bạn sẽ tiếp tục thảo luận nếu có giải pháp hay hơn, hoặc đưa ra các nhận xét. Vài ngày sau thì bắt đầu kì mới.
- Chú ý: Trong phần tính điểm có tính cả điểm xử lí tình huống lỗi, kể cả lỗi dữ liệu đầu vào nếu đề không đề cập!

Đáp án:
Mỗi đề bài đưa ra sẽ bao gồm yêu cầu, kèm theo 1 form mẫu (ở đây dùng VS2010, các bạn dùng bản cũ hơn thì xem cách downgrade ở box Thắc mắc VB.NET & C#) nếu các bạn không muốn thiết kế lại form. Khi gửi đáp án các bạn có 2 cách:
- Gửi cả project qua email hoặc chức năng nhắn tin (đã ghi ở mục trên).
- Chỉ gửi code bằng chức năng nhắn tin của diễn đàn, code được cho vào thẻ code tương ứng, và phải chạy được khi mình copy vào form mẫu đã post.

Giải thưởng:
Sau vài kì, mình sẽ tổng kết một lần, và có một phần quà nhỏ khuyến khích các bạn tham gia. Ngoài ra, các bạn sẽ được thể hiện và học hỏi kĩ năng thông qua cuộc thi, và BQT sẽ chú ý xem xét đưa các bạn giỏi vào các nhóm như Support, Advanced Member.




KÌ 8: BẢO VỆ BÁU VẬT (1)


Tình huống:

Hình ảnh


Trong bộ truyện tranh thám tử lừng danh Conan, Kid là siêu trộm tài ba thực hiện trót lọt hàng trăm vụ trộm đá quí. Lần này, anh ta lại nhắm đến báu vật tại bảo tàng Suzuki theo thách đấu của ông bác già Suzuki Jirokichi. Và ông Suzuki Jirokichi muốn nhờ các lập trình viên kiểm tra xem việc lắp đặt hệ thống laser chống trộm của mình có đảm bảo an toàn hay không. Tất nhiên là làm trước giao thừa (dương lịch) để còn kịp chống trộm nhé!

Yêu cầu:

Hình ảnh


Vì là vật quí nhất nên báu vật này được đặt ở chính giữa viện bảo tàng có kích thước nguyên MaxX x MaxY (2 < MaxX, MaxY < 31, MaxX và MaxY luôn là số chẵn). Máy chiếu laser sẽ được đặt tại biên trái (X = 1), vị trí chiều dọc (Y) có thể thay đổi được (1 < Y < MaxY). Máy này có thể chiếu theo 2 hướng là Lên hoặc Xuống. Các tia laser chiếu qua các ô sẽ theo đường thẳng, nếu gặp các cạnh bảo tàng thì sẽ dội lại theo hướng đối diện.

Hình ảnh


Các tia chiếu sẽ dừng khi gặp một quang trở kế đặt tại một nơi nào đó trên biên của bảo tàng. 4 góc tường cũng xem như là 4 quang trở kế. Nếu tia laser chiếu lặp đi lặp lại mà không gặp được quang trở kế nào thì xem như vô dụng. Laser được phép xuyên qua kho báu.

Hình ảnh


Ông chủ tịch tập đoàn Suzuki sẽ cho chúng ta biết kích thước bảo tàng, vị trí đặt máy chiếu laser (toạ độ Y), hướng chiếu và vị trí đặt quang trở kế. Hãy xác định xem lắp đặt như vậy có an toàn hay không. Một hệ thống gọi là an toàn nếu từ các ô sát biên bảo tàng không thể đi (ngang hoặc dọc, không được đi chéo) đến 1 trong 4 ô xung quanh báu vật. Ô đi qua được phải là ô không có laser đi qua.

Hình ảnh
Bonus: Đố chàng KID lọt qua :D


Ghi chú:

- Dữ liệu vào bảo đảm đúng, không cần kiểm tra.
- Kiểm tra an toàn (đánh dấu vào 1 trong 2 ô Đảm bảo hoặc Không đảm bảo): 6đ, Hình minh hoạ: 4đ. Hình minh hoạ tuỳ ý, miễn có thể hiểu được. Project có bao gồm một hình ảnh kho báu nếu cần sử dụng.
- Thời gian giới hạn: 10s.

Mời các bạn tham gia.




ĐÁP ÁN


Theo mình đề kì này không quá khó, có chăng là phần vẽ hình (4đ) nhưng rất tiếc chỉ có 1 bạn tham gia. Dưới đây là đáp án kì này.

Xếp hạng:
1. tdat00 (8/10)
Tập tin đính kèm
KNLT8_DapAn.rar
(382.79 KiB) Đã tải 589 lần



Hình đại diện của người dùng
nimgiaminh
Thành viên danh dự
Thành viên danh dự
Bài viết: 432
Ngày tham gia: T.Bảy 07/08/2010 9:24 am
Đến từ: Ở dưới đó đó
Has thanked: 6 time
Been thanked: 18 time
Liên hệ:

Re: [Cuộc thi] Kĩ năng lập trình - Kì 8: Bảo vệ báu vật 1

Gửi bàigửi bởi nimgiaminh » CN 26/12/2010 8:43 pm

Xin bạn đừng sử dụng 2010 được không, mình không mở được

Hình đại diện của người dùng
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

Re: [Cuộc thi] Kĩ năng lập trình - Kì 8: Bảo vệ báu vật 1

Gửi bàigửi bởi vo_minhdat2007 » CN 26/12/2010 8:44 pm

Trên nội qui có ghi rồi mà, hướng dẫn downgrade đây: viewtopic.php?f=8&t=11952

Hình đại diện của người dùng
nimgiaminh
Thành viên danh dự
Thành viên danh dự
Bài viết: 432
Ngày tham gia: T.Bảy 07/08/2010 9:24 am
Đến từ: Ở dưới đó đó
Has thanked: 6 time
Been thanked: 18 time
Liên hệ:

Re: [Cuộc thi] Kĩ năng lập trình - Kì 8: Bảo vệ báu vật 1

Gửi bàigửi bởi nimgiaminh » CN 26/12/2010 10:08 pm

Mình đã thừ rồi, nhưng hok mở được, nên mình mới xin xỏ đó

Hình đại diện của người dùng
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

Re: [Cuộc thi] Kĩ năng lập trình - Kì 8: Bảo vệ báu vật 1

Gửi bàigửi bởi vo_minhdat2007 » CN 26/12/2010 10:24 pm

Thử file này xem. Còn không được thì đừng dùng file sln, vào thư mục KNLT8 lấy file project ra xài.
Tập tin đính kèm
KNLT8.rar
(128.49 KiB) Đã tải 435 lần

Hình đại diện của người dùng
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

Re: [Cuộc thi] Kĩ năng lập trình - Kì 8: Bảo vệ báu vật 1

Gửi bàigửi bởi vo_minhdat2007 » T.Năm 30/12/2010 5:25 pm

Bài của bạn tdat00 làm tốt quá :D. Chỉ có điều còn 1 trường hợp đặc biệt thì lại chạy sai :D Mình thấy đề kì này không khó, bẫy cũng không (vì dữ liệu vào đảm bảo hết) mà ít người tham gia quá cũng hơi rầu.

Hình đại diện của người dùng
tdat00
Thành viên tích cực
Thành viên tích cực
Bài viết: 137
Ngày tham gia: T.Bảy 29/03/2008 8:18 am
Has thanked: 8 time
Been thanked: 2 time

Re: [Cuộc thi] Kĩ năng lập trình - Kì 8: Bảo vệ báu vật 1

Gửi bàigửi bởi tdat00 » T.Năm 30/12/2010 10:26 pm

Đặc biệt à? Không lẽ nếu quang trở trùng với vị trí máy phát thì vẫn được chấp nhận sao :-?

Anyway, mình chơi theo kiểu thi Olympic, một lần nộp duy nhất thôi, ko sửa ^^

Hình đại diện của người dùng
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

Re: [Cuộc thi] Kĩ năng lập trình - Kì 8: Bảo vệ báu vật 1

Gửi bàigửi bởi vo_minhdat2007 » T.Sáu 31/12/2010 9:21 am

Wow, biết luôn chỗ sai nữa à :D Bái phục :D Mình đâu có bảo quang trở phải khác vị trí máy phát đâu nè, đúng không :D

Hình đại diện của người dùng
VuVanHoanh
Thành viên danh dự
Thành viên danh dự
Bài viết: 1259
Ngày tham gia: T.Năm 03/06/2010 9:23 pm
Đến từ: Kim Sơn - Đông Triều - Quảng Ninh
Has thanked: 22 time
Been thanked: 137 time
Liên hệ:

Re: [Cuộc thi] Kĩ năng lập trình - Kì 8: Bảo vệ báu vật 1

Gửi bàigửi bởi VuVanHoanh » T.Sáu 07/01/2011 10:56 am

Nhà ông Suzuki bị KID đột nhập hôm 30 rồi, báu vật không cánh mà lượn, kết thúc kỳ là vừa.

@Anh Đạt: Đề kỳ 9 anh Đạt cho dể thui, mấy lần trước khó với VB góa. :((

Hình đại diện của người dùng
nimgiaminh
Thành viên danh dự
Thành viên danh dự
Bài viết: 432
Ngày tham gia: T.Bảy 07/08/2010 9:24 am
Đến từ: Ở dưới đó đó
Has thanked: 6 time
Been thanked: 18 time
Liên hệ:

Re: [Cuộc thi] Kĩ năng lập trình - Kì 8: Bảo vệ báu vật 1

Gửi bàigửi bởi nimgiaminh » T.Sáu 07/01/2011 3:21 pm

Đúng rồi đó, bạn cứ cho đề khó như vậy thì làm sao mình có thể gửi bài được.

Hình đại diện của người dùng
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

Re: [Cuộc thi] Kĩ năng lập trình - Kì 8: Bảo vệ báu vật 1

Gửi bàigửi bởi vo_minhdat2007 » T.Sáu 07/01/2011 4:00 pm

Thực ra mình không hiểu đề này khó ở chỗ nào, vì ở đề này không cần dùng đến thuật toán cao cấp như đệ qui, qui hoạch động, ... mà chỉ cần xét 4 trường hợp là đủ rồi mà?

Mình sắp thi HSG nên bận xíu chưa đóng kì này được, thứ 5 mình thi xong sẽ ra kì mới. Kì sau đề cũng sẽ tương tự bài này, nhưng là theo ô nên sẽ có phần dễ hơn là đi chéo thế này.

Hình đại diện của người dùng
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

Re: [Cuộc thi] Kĩ năng lập trình - Kì 8: Bảo vệ báu vật 1

Gửi bàigửi bởi vo_minhdat2007 » T.Hai 24/01/2011 9:06 pm

Bài của bạn tdat00:

Code:

  1. /*
  2.  * KNLT 08
  3.  * Solved 01:44 AM 12/29/2010
  4.  *
  5.  * LE THANH DAT
  6.  *
  7.  * <!-- e --><a href="mailto:tdat00@gmail.com">tdat00@gmail.com</a><!-- e -->
  8.  * <!-- m --><a class="postlink" href="http://www.lethanhdat.com">http://www.lethanhdat.com</a><!-- m -->
  9.  *
  10.  * VBClub Account: tdat00 (<!-- l --><a class="postlink-local" href="http://caulacbovb.com/forum/memberlist.php?mode=viewprofile&u=744">memberlist.php?mode=viewprofile&u=744</a><!-- l -->)
  11. */
  12.  
  13. using System;
  14. using System.Collections.Generic;
  15. using System.Drawing;
  16. using System.Drawing.Drawing2D;
  17. using System.Windows.Forms;
  18.  
  19. namespace KNLT_08
  20. {
  21.     public partial class frmMain : Form
  22.     {
  23.         #region TypeDefine
  24.  
  25.         enum myMargin
  26.         {
  27.             Top, Left, Right, Bottom, Other
  28.         }
  29.  
  30.         struct myPoint
  31.         {
  32.             public int Col;
  33.             public int Row;
  34.  
  35.             public myPoint(int col, int row)
  36.             {
  37.                 Col = col;
  38.                 Row = row;
  39.             }
  40.         }
  41.  
  42.         enum PointShape
  43.         {
  44.             Square,
  45.             Round
  46.         }
  47.  
  48.         enum EdgeShape
  49.         {
  50.             Vector,
  51.             Line
  52.         }
  53.  
  54.         enum Direction
  55.         {
  56.             Up,
  57.             Down
  58.         }
  59.  
  60.         #endregion
  61.  
  62.         public frmMain()
  63.         {
  64.             InitializeComponent();
  65.  
  66.             cboType.SelectedIndex = 1;
  67.         }
  68.  
  69.         private int RoomWidth, RoomHeight;
  70.         private bool[,] Map = new bool[0, 0];
  71.         private HashSet<myPoint> Stop = new HashSet<myPoint>();
  72.         private HashSet<myPoint> PassedPoint = new HashSet<myPoint>();
  73.  
  74.         private void cmdCheck_Click(object sender, EventArgs e)
  75.         {
  76.             // Erase old result
  77.             this.Refresh();
  78.             chkSafe.Checked = false; chkNotSafe.Checked = false;
  79.  
  80.             #region Draw
  81.  
  82.             #region Draw Room
  83.  
  84.             RoomWidth = (int)numRoomWidth.Value;
  85.             RoomHeight = (int)numRoomHeight.Value;
  86.  
  87.             int max = RoomWidth > RoomHeight ? RoomWidth : RoomHeight;
  88.             SPACE = max <= 12 ? 40 : (max >= 22 ? 18 : 26);
  89.  
  90.             for (int i = 1; i <= RoomHeight + 1; i++)
  91.             {
  92.                 DrawEdge(new myPoint(1, i), new myPoint(RoomWidth + 1, i), 1, Color.DarkOrange, EdgeShape.Line);
  93.             }
  94.  
  95.             for (int i = 1; i <= RoomWidth + 1; i++)
  96.             {
  97.                 DrawEdge(new myPoint(i, 1), new myPoint(i, RoomHeight + 1), 1, Color.DarkOrange, EdgeShape.Line);
  98.             }
  99.  
  100.             #endregion
  101.  
  102.             // Draw Treasure
  103.             DrawPoint(new myPoint(RoomWidth / 2 + 1, RoomHeight / 2 + 1), PointShape.Square, 28, Color.Gold);
  104.  
  105.             // Draw Start Pos
  106.             myPoint start = new myPoint(1, (int)numStart.Value);
  107.             DrawPoint(start, 12, Color.Green);
  108.  
  109.             // Draw End Pos
  110.             myPoint end = new myPoint((int)numEndCol.Value, (int)numEndRow.Value);
  111.             DrawPoint(end, PointShape.Square, 12, Color.Blue);
  112.  
  113.             #endregion
  114.  
  115.             Map = new bool[RoomWidth, RoomHeight];
  116.            
  117.             PassedPoint = new HashSet<myPoint>();
  118.             PassedPoint.Add(start);
  119.  
  120.             Stop = new HashSet<myPoint>();
  121.             Stop.Add(end);
  122.  
  123.             // add 4 corner
  124.             Stop.Add(new myPoint(1, 1)); Stop.Add(new myPoint(RoomWidth + 1, 1));
  125.             Stop.Add(new myPoint(1, RoomHeight + 1)); Stop.Add(new myPoint(RoomWidth + 1, RoomHeight + 1));
  126.  
  127.             #region draw path
  128.  
  129.             Direction direction = cboType.SelectedIndex == 0 ? Direction.Up : Direction.Down;
  130.             myMargin previousMargin = myMargin.Left; // begin on the left side
  131.             myMargin nextMargin;
  132.             myPoint next;
  133.  
  134.             do
  135.             {
  136.                 #region go straight on untill come to the next margin
  137.  
  138.                 do
  139.                 {
  140.                     next = new myPoint();
  141.                     #region get next point
  142.  
  143.                     if (direction == Direction.Up)
  144.                     {
  145.                         switch (previousMargin)
  146.                         {
  147.                             case myMargin.Left:
  148.                                 next.Col = start.Col + 1;
  149.                                 next.Row = start.Row - 1;
  150.                                 Map[start.Col - 1, start.Row - 2] = true;
  151.                                 break;
  152.                             case myMargin.Top:
  153.                                 next.Col = start.Col + 1;
  154.                                 next.Row = start.Row + 1;
  155.                                 Map[start.Col - 1, start.Row - 1] = true;
  156.                                 break;
  157.                             case myMargin.Right:
  158.                                 next.Col = start.Col - 1;
  159.                                 next.Row = start.Row + 1;
  160.                                 Map[start.Col - 2, start.Row - 1] = true;
  161.                                 break;
  162.                             default: // Bottom
  163.                                 next.Col = start.Col - 1;
  164.                                 next.Row = start.Row - 1;
  165.                                 Map[start.Col - 2, start.Row - 2] = true;
  166.                                 break;
  167.                         }
  168.                     }
  169.                     else // Down
  170.                     {
  171.                         switch (previousMargin)
  172.                         {
  173.                             case myMargin.Left:
  174.                                 next.Col = start.Col + 1;
  175.                                 next.Row = start.Row + 1;
  176.                                 Map[start.Col - 1, start.Row - 1] = true;
  177.                                 break;
  178.                             case myMargin.Top:
  179.                                 next.Col = start.Col - 1;
  180.                                 next.Row = start.Row + 1;
  181.                                 Map[start.Col - 2, start.Row - 1] = true;
  182.                                 break;
  183.                             case myMargin.Right:
  184.                                 next.Col = start.Col - 1;
  185.                                 next.Row = start.Row - 1;
  186.                                 Map[start.Col - 2, start.Row - 2] = true;
  187.                                 break;
  188.                             default: // Bottom
  189.                                 next.Col = start.Col + 1;
  190.                                 next.Row = start.Row - 1;
  191.                                 Map[start.Col - 1, start.Row - 2] = true;
  192.                                 break;
  193.                         }
  194.                     }
  195.  
  196.                     #endregion
  197.  
  198.                     DrawEdge(start, next, 2, Color.Red, EdgeShape.Vector);
  199.                     start = next;
  200.                     nextMargin = GetMargin(start);
  201.                 }
  202.                 while (nextMargin == myMargin.Other);
  203.  
  204.                 #endregion
  205.  
  206.                 if (PassedPoint.Contains(start)) // endless loop
  207.                 {
  208.                     chkNotSafe.Checked = true;
  209.                     return;
  210.                 }
  211.                 // else
  212.                 PassedPoint.Add(start);
  213.  
  214.                 #region rotate direction
  215.  
  216.                 if ((previousMargin == myMargin.Left && nextMargin == myMargin.Right) ||
  217.                     (previousMargin == myMargin.Right && nextMargin == myMargin.Left) ||
  218.                     (previousMargin == myMargin.Top && nextMargin == myMargin.Bottom) ||
  219.                     (previousMargin == myMargin.Bottom && nextMargin == myMargin.Top))
  220.                 {
  221.                     direction = direction == Direction.Down ? Direction.Up : Direction.Down;
  222.                 }
  223.  
  224.                 #endregion
  225.  
  226.                 previousMargin = nextMargin;
  227.             }
  228.             while (!Stop.Contains(start));
  229.  
  230.             #endregion
  231.  
  232.             #region check security
  233.             // need not backup map array
  234.  
  235.             // check Bottom-Right Cell
  236.             if (!Map[RoomWidth / 2, RoomHeight / 2] && IsBreakable(RoomWidth / 2, RoomHeight / 2))
  237.             {
  238.                 chkNotSafe.Checked = true;
  239.                 return;
  240.             }
  241.  
  242.             // check Bottom-Left Cell
  243.             if (!Map[RoomWidth / 2 - 1, RoomHeight / 2] && IsBreakable(RoomWidth / 2 - 1, RoomHeight / 2))
  244.             {
  245.                 chkNotSafe.Checked = true;
  246.                 return;
  247.             }
  248.  
  249.             // check Top-Right Cell
  250.             if (!Map[RoomWidth / 2, RoomHeight / 2 - 1] && IsBreakable(RoomWidth / 2, RoomHeight / 2 - 1))
  251.             {
  252.                 chkNotSafe.Checked = true;
  253.                 return;
  254.             }
  255.  
  256.             // check Top-Left Cell
  257.             if (!Map[RoomWidth / 2 - 1, RoomHeight / 2 - 1] && IsBreakable(RoomWidth / 2 - 1, RoomHeight / 2 - 1))
  258.             {
  259.                 chkNotSafe.Checked = true;
  260.                 return;
  261.             }
  262.            
  263.             // else
  264.             chkSafe.Checked = true;
  265.  
  266.             #endregion
  267.         }
  268.  
  269.         private bool IsBreakable(int i, int j)
  270.         {
  271.             if (i == 0 || j == 0 || i == RoomWidth - 1 || j == RoomHeight - 1)
  272.                 return true;
  273.  
  274.             bool res;
  275.             Map[i, j] = true;
  276.  
  277.             if (!Map[i - 1, j])
  278.             {
  279.                 res = IsBreakable(i - 1, j);
  280.                 if (res) return true;
  281.             }
  282.             if (!Map[i, j - 1])
  283.             {
  284.                 res = IsBreakable(i, j - 1);
  285.                 if (res) return true;
  286.             }
  287.             if (!Map[i + 1, j])
  288.             {
  289.                 res = IsBreakable(i + 1, j);
  290.                 if (res) return true;
  291.             }
  292.             if (!Map[i, j + 1])
  293.             {
  294.                 res = IsBreakable(i, j + 1);
  295.                 if (res) return true;
  296.             }
  297.             //Map[i, j] = false;
  298.  
  299.             return false;
  300.         }
  301.  
  302.         private myMargin GetMargin(myPoint p)
  303.         {
  304.             if (p.Col < 1 || p.Row < 1 || p.Col > RoomWidth + 1 || p.Row > RoomHeight + 1)
  305.                 return myMargin.Other;
  306.  
  307.             if (p.Col == 1)
  308.                 return myMargin.Left;
  309.             if (p.Col == RoomWidth + 1)
  310.                 return myMargin.Right;
  311.  
  312.             if (p.Row == 1)
  313.                 return myMargin.Top;
  314.             if (p.Row == RoomHeight + 1)
  315.                 return myMargin.Bottom;
  316.  
  317.             return myMargin.Other;
  318.         }
  319.  
  320.         #region Drawing
  321.  
  322.         private int PadLeft = 10, PadTop = 100;
  323.         private int SPACE = 10;
  324.  
  325.         #region DrawPoint
  326.  
  327.         private void DrawPoint(int Collumn, int Row, int size, Color color)
  328.         {
  329.             DrawPoint(new myPoint(Collumn, Row), size, color);
  330.         }
  331.  
  332.         private void DrawPoint(myPoint point, int size, Color color)
  333.         {
  334.             DrawPoint(point, PointShape.Round, size, color);
  335.         }
  336.  
  337.         private void DrawPoint(myPoint point, PointShape shape, int size, Color color)
  338.         {
  339.             Graphics g = this.CreateGraphics();
  340.             Pen p = new Pen(new SolidBrush(color));
  341.  
  342.             Rectangle shp = new Rectangle(PadLeft + (point.Col - 1) * SPACE - size / 2, PadTop + (point.Row - 1) * SPACE - size / 2, size, size);
  343.  
  344.             if (shape == PointShape.Square)
  345.             {
  346.                 g.FillRectangle(new SolidBrush(color), shp);
  347.                 g.DrawRectangle(p, shp);
  348.             }
  349.             else
  350.             {
  351.                 g.FillEllipse(new SolidBrush(color), shp);
  352.                 g.DrawEllipse(p, shp);
  353.             }
  354.         }
  355.  
  356.         #endregion
  357.  
  358.         #region DrawEdge
  359.  
  360.         private void DrawEdge(myPoint from, myPoint to, int size, Color color, EdgeShape type)
  361.         {
  362.             Graphics g = this.CreateGraphics();
  363.             g.SmoothingMode = SmoothingMode.AntiAlias;
  364.  
  365.             Pen p = new Pen(color, size);
  366.             p.StartCap = LineCap.NoAnchor;
  367.             if (type == EdgeShape.Line)
  368.             {
  369.                 p.EndCap = LineCap.NoAnchor;
  370.             }
  371.             else
  372.             {
  373.                 p.EndCap = LineCap.ArrowAnchor;
  374.             }
  375.  
  376.             Point f = new Point(PadLeft + (from.Col - 1) * SPACE, PadTop + (from.Row - 1) * SPACE);
  377.             Point t = new Point(PadLeft + (to.Col - 1) * SPACE, PadTop + (to.Row - 1) * SPACE);
  378.             g.DrawLine(p, f, t);
  379.         }
  380.  
  381.         #endregion
  382.  
  383.         #endregion
  384.     }
  385. }
  386.  


Nhận xét:

Nhìn chung cách giải của bạn tương tự như đáp án của mình, tuy nhiên mình không có thời gian xem kĩ lắm. Mặc dù vậy chương trình của bạn chạy sai ở trường hợp máy thu trùng vị trí máy phát, nhưng cũng rất hoan nghênh vì bạn là thành viên duy nhất tham dự kì thi này!

Điểm: 8/10.

Hình đại diện của người dùng
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

Re: [Cuộc thi] Kĩ năng lập trình - Kì 8: Bảo vệ báu vật 1

Gửi bàigửi bởi vo_minhdat2007 » T.Hai 24/01/2011 9:11 pm

Đã cập nhật đáp án, mời các bạn tiếp tục thảo luận. Kì sau mình sẽ cho câu hỏi rất dễ liên quan đến Windows Forms ;)

anhvietanhviet
Thành viên chính thức
Thành viên chính thức
Bài viết: 14
Ngày tham gia: T.Ba 14/12/2010 2:46 pm
Has thanked: 2 time

Re: [Cuộc thi] Kĩ năng lập trình - Kì 8: Bảo vệ báu vật 1

Gửi bàigửi bởi anhvietanhviet » T.Ba 25/01/2011 10:58 am

không hiểu gì cả.

Hình đại diện của người dùng
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

Re: [Cuộc thi] Kĩ năng lập trình - Kì 8: Bảo vệ báu vật 1

Gửi bàigửi bởi vo_minhdat2007 » T.Ba 25/01/2011 11:44 am

Thế bạn không hiểu phần nào?


Quay về “Đề tài chung”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.1 khách