Chatbox

Các bạn vui lòng dùng từ ngữ lịch sự và có văn hóa,sử dụng Tiếng Việt có dấu chuẩn. Chúc các bạn vui vẻ!
14/11/2011 14:11 # 1
dirtbikegame
Cấp độ: 1 - Kỹ năng: 1

Kinh nghiệm: 1/10 (10%)
Kĩ năng: 0/10 (0%)
Ngày gia nhập: 14/11/2011
Bài gởi: 1
Được cảm ơn: 0
Phản hồi: Các bài luyện tập cho OLP 2012


Đọc mãi mà không hiểu giờ học lại thế nào đây, ôi nhiều kiến thức phải học quá



 
15/11/2011 09:11 # 2
dieuhb
Cấp độ: 3 - Kỹ năng: 3

Kinh nghiệm: 0/30 (0%)
Kĩ năng: 14/30 (47%)
Ngày gia nhập: 04/02/2010
Bài gởi: 30
Được cảm ơn: 44
Các bài luyện tập cho OLP 2012


Trích:
Trích:
Trích:
vnttqb cần nói sơ qua về thuật toán để cho các bạn cùng bình luận.
 Em phân chia tứ giác thành 2 tam giác và xét đk để điểm đó thuộc tứ giác là phải thuộc ít nhất 1 trong 2 tam giác ( tồn tại trường hợp điểm đó thuộc cả 2 tam giác khi nó nằm trên đoạn phân chia 2 tam giác)  Bằng cách tính tổng diện tích so với diện tích tam giác ta phân chia ra. 
Tuy nhiên việc xét phân tam giác cần chú ý đến trường hợp tứ giác lõm. vậy nên cần tìm dc đỉnh lõm và phân chia 2 tam giác tại đó

  
Quên mất trường hợp !=.=
 
 vnttqb đã phân chia ra 2  trường hợp của bài toán. Đúng.
Vấn đề còn lại là xét điểm có thuộc tam giác hay không.
Nếu em làm theo cách tính diện tích thì có thể tồn tại sai số và thời gian tính chưa hiệu quả.
Em nghiên cứu có thể cải tiến chỗ này.
Gợi ý:
 Một điểm nếu nằm trong tam giác thì nó ở "trên" 2 cạnh và "dưới" 1 cạnh hoặc dưới 2 cạnh trên 1 cạnh (trừ trường hợp thuộc cạnh)
"trên - dưới " có thể xét là "bên trái - bên phải".

Em dùng phương trình đường thẳng qua hai điểm để giải.

-----------------------
Đây là cách làm theo định hướng ban đầu của em.
Có cách hiểu quả hơn và có thể giải cho trường hợp tổng quát, sẽ bàn trong các bài đến.



 



 
Các thành viên đã Thank dieuhb vì Bài viết có ích:
15/11/2011 13:11 # 3
vnttqb
Cấp độ: 13 - Kỹ năng: 8

Kinh nghiệm: 5/130 (4%)
Kĩ năng: 39/80 (49%)
Ngày gia nhập: 21/03/2011
Bài gởi: 785
Được cảm ơn: 319
Các bài luyện tập cho OLP 2012


 Em có thể 1 điểm thuộc tam giác (  trọng tâm) rôi xét  vị trí tương với điểm cần xét với điểm đó.
Thầy có thể gợi ý cách giải tối ưu được không a. Em cảm ơn.


======================================================================================================

Cuộc đời là một dòng sông. Ai không bơi thì chết. 
 

Name: Tien (Tory) TRAN
Email: TranTien29@gmail.com


 
15/11/2011 18:11 # 4
dieuhb
Cấp độ: 3 - Kỹ năng: 3

Kinh nghiệm: 0/30 (0%)
Kĩ năng: 14/30 (47%)
Ngày gia nhập: 04/02/2010
Bài gởi: 30
Được cảm ơn: 44
Các bài luyện tập cho OLP 2012


Để tìm vị trí của 1 điểm p so với đường thẳng (vector) ab, ta dùng công thức sau

struct point {int x,y;};

int ps(point a, point b, point p)
{
    int h= (b.x -a.x)*(p.y-a.y) - (b.y-a.y)*(p.x-a.x);
    if (h<0) return -1;
    else if (h>0) return 1;
         else return 0;
}

nếu =1 ở phía trên (hay bên trái)
0 nằm trên đường thẳng qua ab (muốn kiểm tra thuộc đoạn thẳng thì em cho thêm chút điều kiện nữa) 
nếu =-1 ở phía dưới (hay bên phải)

Với gợi ý trên, p muốn thuộc tam giác thì phải ở giữa các cặp [ab, ac], [ba, bc], [ca,cb]
Có xét thêm trường hợp thuộc cạnh.

Với công thức trên ta hoàn toàn tránh được sai số nếu phải dùng phép căn bậc hai.

Lưu ý: vẫn còn thuật toán tối ưu hơn (về thời gian chạy) để xác định điểm trong hay ngoài tam giác!

Mong các em sớm hoàn thành bài này.


 @ vnttqb: em nên đặt tên file là inside1.cpp , phần comment ghi tên tác giả (vì phần mềm chấm ko nhận ra tên chương trình gốc)
 




 
15/11/2011 23:11 # 5
vnttqb
Cấp độ: 13 - Kỹ năng: 8

Kinh nghiệm: 5/130 (4%)
Kĩ năng: 39/80 (49%)
Ngày gia nhập: 21/03/2011
Bài gởi: 785
Được cảm ơn: 319
Các bài luyện tập cho OLP 2012


 Điều kiện để 1 điểm M thuộc tam giác ABC  là det(AM,AC), det (BM,BA) và det(CM,CB) cùng dấu. vậy nên em làm như thế này. 

 float det(toado M,toado N,toado Q)   // tính det(MN,MQ)  -> dùng để tính định thức 
{
      toado tg;
      tg.x=N.x-M.x;
      tg.y=N.y-M.y;
      toado tg2;
      tg2.x=Q.x-M.x;
      tg2.y=Q.y-M.y;
      return((tg.x*tg2.y)-(tg.y*tg2.x));
}
 
int kiemtra(toado x,toado y,toado z,toado kt)    // Truyền vào đối số x, y,z là tạo độ 3 đỉnh của tam giác, kt là điểm cần kiểm tra 
{
    if(det(x,kt,z)*det(y,kt,x)<0) return(0);
    else 
       if(det(x,kt,z)*det(z,kt,y)>=0) return(1);    
      return(0);     
}
// Đọc 1 điểm rồi kiểm tra thỏa đk ở hàm kiemtra thì điểm đó thuộc tứ giác ( Cần tìm được điểm lõm để phân chia tứ giác )


 
File đính kèm Bạn phải đăng nhập mới thấy link download


======================================================================================================

Cuộc đời là một dòng sông. Ai không bơi thì chết. 
 

Name: Tien (Tory) TRAN
Email: TranTien29@gmail.com


 
17/11/2011 15:11 # 6
dieuhb
Cấp độ: 3 - Kỹ năng: 3

Kinh nghiệm: 0/30 (0%)
Kĩ năng: 14/30 (47%)
Ngày gia nhập: 04/02/2010
Bài gởi: 30
Được cảm ơn: 44
Phản hồi: Các bài luyện tập cho OLP 2012



Các bạn xem và bàn luận về chương trình do tác giả vnttqb gửi

  1. #include "stdio.h"
  2. #include "conio.h"
  3. struct toado
  4. {
  5.        float x;
  6.        float y;
  7. };
  8. float det(toado M,toado N,toado Q)
  9. {
  10.       toado tg;
  11.       tg.x=N.x-M.x;
  12.       tg.y=N.y-M.y;
  13.       toado tg2;
  14.       tg2.x=Q.x-M.x;
  15.       tg2.y=Q.y-M.y;
  16.       return((tg.x*tg2.y)-(tg.y*tg2.x));
  17. }
  18. int kiemtra(toado x,toado y,toado z,toado kt)
  19. {
  20.     if(det(x,kt,z)*det(y,kt,x)<0) return(0);
  21.     else
  22.        if(det(x,kt,z)*det(z,kt,y)>=0) return(1);   
  23.       return(0);    
  24. }
  25. int xuli(FILE *f,toado lom1, toado lom2,toado loi1,toado loi2,int n)
  26.  {
  27.     int so=0;
  28.     for ( int i=0; i<n;i++)
  29.        {
  30.           toado kt;
  31.           fscanf(f,"%f",&kt.x);
  32.           fscanf(f,"%f",&kt.y);
  33.           if( kiemtra(lom1,lom2,loi1,kt) || kiemtra(lom1,lom2,loi2,kt))
  34.           so++;
  35.        }
  36.     return (so);
  37.  }
  38.  
  39. float T_toado(toado A,toado B,toado C)
  40. {
  41.       // thay toa do vao duong thang
  42.       return ((B.y-A.y)*(C.x-A.x)-(B.x-A.x)*(C.y-A.y));    
  43. int main()
  44. {
  45.     toado A,B,C,D;
  46.     FILE *fi,*fo;
  47.     int n,dem=0;   
  48.     fi=fopen("INSIDE1.inp","rt");
  49.     fo=fopen("INSIDE1.out","wt");       
  50.     if(fi==NULL) fprintf(fo," TEP KHONG TON TAI");
  51.     // doc toa do 4 diem A B C D
  52.     fscanf(fi,"%f",&A.x);   fscanf(fi,"%f",&A.y);
  53.     fscanf(fi,"%f",&B.x);   fscanf(fi,"%f",&B.y);
  54.     fscanf(fi,"%f",&C.x);   fscanf(fi,"%f",&C.y);
  55.     fscanf(fi,"%f",&D.x);   fscanf(fi,"%f",&D.y);
  56.     fscanf(fi,"%d",&n);
  57.         if((T_toado(D,B,C)* T_toado(D,B,A))>=0)
  58.     dem=xuli(fi,A,C,B,D,n);
  59.     else
  60.    dem=xuli(fi,B,D,A,C,n);  
  61.    // XUAT KET QUA
  62.     fprintf(fo,"\t%d",dem);
  63.     fclose(fi);
  64.     fclose(fo);
  65.  }
  66. ----------------------------------------



 
22/11/2011 15:11 # 7
dieuhb
Cấp độ: 3 - Kỹ năng: 3

Kinh nghiệm: 0/30 (0%)
Kĩ năng: 14/30 (47%)
Ngày gia nhập: 04/02/2010
Bài gởi: 30
Được cảm ơn: 44
Phản hồi: Các bài luyện tập cho OLP 2012


Sau đây chúng ta cùng qua 1 bài mới. Bài này là bài mở rộng từ bài 3- INSIDE1

Bài 4 POL.cpp - POL.java


Các điểm cho dưới đây xét trong hệ tọa độ Oxy.
Cho đa giác n cạnh gồm n điểm liên tiếp A, B, C ... theo chiều kim đồng hồ. Hãy kiểm tra xem điểm Z có thuộc đa giác đó không. 

Dữ liệu vào theo định dạng như sau:

----------POL.INP-------------
| n 
|XA YA XB YB XC YC   Xn Yn      |
| XZ YZ                                   |
----------------------------------------

Dữ liệu ra chứa trong file POL.OUT, chứa duy nhất số 1 nếu Z thuộc đa giác, 0 nếu ngược lại.

3<=n< 20
-1000<X, Y<=1000
Thời gian chạy <= 1 giây.

Ví dụ 

input 
6
0 0 0 7 4 10 6 8 5 6  7 -2
1 1


output
1



 
Các thành viên đã Thank dieuhb vì Bài viết có ích:
25/11/2011 10:11 # 8
dieuhb
Cấp độ: 3 - Kỹ năng: 3

Kinh nghiệm: 0/30 (0%)
Kĩ năng: 14/30 (47%)
Ngày gia nhập: 04/02/2010
Bài gởi: 30
Được cảm ơn: 44
Các bài luyện tập cho OLP 2012


Gợi ý cách giải:

- Kẻ đường thẳng qua điểm Z, song song với trục Oy và đi về hướng tăng dần của x (toán học gọi là ray [google])
- Tưởng tượng ta đang di chuyển điểm Z trên đường thẳng đó.
Một điểm nếu nó ở trong đa giác thì nó số cạnh mà  điểm Z gặp là số lẻ, nếu ngoài là số chẵn.
Vì khi gặp một cạnh thì  điểm đó chuyển trạng thái: trong ra ngoài, hoặc từ ngoài vào trong....

CỐ GẮNG LÊN CÁC BẠN...



 
25/11/2011 12:11 # 9
vnttqb
Cấp độ: 13 - Kỹ năng: 8

Kinh nghiệm: 5/130 (4%)
Kĩ năng: 39/80 (49%)
Ngày gia nhập: 21/03/2011
Bài gởi: 785
Được cảm ơn: 319
Phản hồi: Các bài luyện tập cho OLP 2012


 Em chưa làm nhưng em nghĩ cách thầy đưa ra hình như sai rồi. Thầy xem trước hợp tam giác thì đừng thẳng cắt 2 lần nhưng nó vẫn ở trong tam giác.  
Chắc một thời gian nữa xem ai giải không chứ cả topic được ít thành viên tham gia quá. tỉ lệ xem thì cao nhưng k ai post bài lên cả. hehe


======================================================================================================

Cuộc đời là một dòng sông. Ai không bơi thì chết. 
 

Name: Tien (Tory) TRAN
Email: TranTien29@gmail.com


 
Các thành viên đã Thank vnttqb vì Bài viết có ích:
25/11/2011 15:11 # 10
dieuhb
Cấp độ: 3 - Kỹ năng: 3

Kinh nghiệm: 0/30 (0%)
Kĩ năng: 14/30 (47%)
Ngày gia nhập: 04/02/2010
Bài gởi: 30
Được cảm ơn: 44
Các bài luyện tập cho OLP 2012


Trích:
Gợi ý cách giải:

- Kẻ đường thẳng qua điểm Z, song song với trục Oy và đi về hướng tăng dần của x (toán học gọi là ray [google])
- Tưởng tượng ta đang di chuyển điểm Z trên đường thẳng đó.
Một điểm nếu nó ở trong đa giác thì nó số cạnh mà  điểm Z gặp là số lẻ, nếu ngoài là số chẵn.
Vì khi gặp một cạnh thì  điểm đó chuyển trạng thái: trong ra ngoài, hoặc từ ngoài vào trong....

 
 
Trích:
Em chưa làm nhưng em nghĩ cách thầy đưa ra hình như sai rồi. Thầy xem trước hợp tam giác thì đừng thẳng cắt 2 lần nhưng nó vẫn ở trong tam giác.
Chắc một thời gian nữa xem ai giải không chứ cả topic được ít thành viên tham gia quá. tỉ lệ xem thì cao nhưng k ai post bài lên cả. hehe
Ta chỉ đi từ Z về hướng tăng dần của x thôi (vnttqb chắc đi theo cả hai hướng).

Trường hợp tam giác thì chỉ cắt 1 cạnh thôi.
vnttqb xem lại chút.



 
25/11/2011 20:11 # 11
vnttqb
Cấp độ: 13 - Kỹ năng: 8

Kinh nghiệm: 5/130 (4%)
Kĩ năng: 39/80 (49%)
Ngày gia nhập: 21/03/2011
Bài gởi: 785
Được cảm ơn: 319
Phản hồi: Các bài luyện tập cho OLP 2012


 Trường hợp điểm đó nằm tại 1 đỉnh thì sao thầy. ( xét với tam giác ) vậy trạng thái ban đầu thì nó nằm trong hay ngoài . em không nghĩ nó đúng với trường hợp trên trừ khi ta có 1 điều kiện trang thái ban đầu cho nó.


======================================================================================================

Cuộc đời là một dòng sông. Ai không bơi thì chết. 
 

Name: Tien (Tory) TRAN
Email: TranTien29@gmail.com


 
26/11/2011 08:11 # 12
dieuhb
Cấp độ: 3 - Kỹ năng: 3

Kinh nghiệm: 0/30 (0%)
Kĩ năng: 14/30 (47%)
Ngày gia nhập: 04/02/2010
Bài gởi: 30
Được cảm ơn: 44
Các bài luyện tập cho OLP 2012


Có các vấn đề mình cần lưu ý khi cài đặt thuật toán:
- Điểm đó nằm trên cạnh.
- Điểm đó trùng với một điểm của đa giác.
Nguồn : http:// alienryderflex .com/ polygon/
Point-In-Polygon Algorithm
Figure 1

Figure 1 demonstrates a typical case of a severely concave polygon with 14 sides. The red dot is a point which needs to be tested, to determine if it lies inside the polygon.

The solution is to compare each side of the polygon to the Y (vertical) coordinate of the test point, and compile a list of nodes, where each node is a point where one side crosses the Y threshold of the test point. In this example, eight sides of the polygon cross the Y threshold, while the other six sides do not. Then, if there are an odd number of nodes on each side of the test point, then it is inside the polygon; if there are an even number of nodes on each side of the test point, then it is outside the polygon. In our example, there are five nodes to the left of the test point, and three nodes to the right. Since five and three are odd numbers, our test point is inside the polygon.

(Note: This algorithm does not care whether the polygon is traced in clockwise or counterclockwise fashion.)


Figure 2

Figure 2 shows what happens if the polygon crosses itself. In this example, a ten-sided polygon has lines which cross each other. The effect is much like “exclusive or,” or XOR as it is known to assembly-language programmers. The portions of the polygon which overlap cancel each other out. So, the test point is outside the polygon, as indicated by the even number of nodes (two and two) on either side of it.


Figure 3

In Figure 3, the six-sided polygon does not overlap itself, but it does have lines that cross. This is not a problem; the algorithm still works fine.


Figure 4

Figure 4 demonstrates the problem that results when a vertex of the polygon falls directly on the Y threshold. Since sides a and b both touch the threshold, should they both generate a node? No, because then there would be two nodes on each side of the test point and so the test would say it was outside of the polygon, when it clearly is not!

The solution to this situation is simple. Points which are exactly on the Y threshold must be considered to belong to one side of the threshold. Let’s say we arbitrarily decide that points on the Y threshold will belong to the “above” side of the threshold. Then, side a generates a node, since it has one endpoint below the threshold and its other endpoint on-or-above the threshold. Side b does not generate a node, because both of its endpoints are on-or-above the threshold, so it is not considered to be a threshold-crossing side.


Figure 5

Figure 5 shows the case of a polygon in which one of its sides lies entirely on the threshold. Simply follow the rule as described concerning Figure 4. Side c generates a node, because it has one endpoint below the threshold, and its other endpoint on-or-above the threshold. Side d does not generate a node, because it has both endpoints on-or-above the threshold. And side e also does not generate a node, because it has both endpoints on-or-above the threshold.


Figure 6

Figure 6 illustrates a special case brought to my attention by John David Munch of Cal Poly. One interior angle of the polygon just touches the Y-threshold of the test point. This is OK. In the upper picture, only one side (hilited in red) generates a node to the left of the test point, and in the bottom example, three sides do. Either way, the number is odd, and the test point will be deemed inside the polygon.


Polygon Edge

If the test point is on the border of the polygon, this algorithm will deliver unpredictable results; i.e. the result may be “inside” or “outside” depending on arbitrary factors such as how the polygon is oriented with respect to the coordinate system. (That is not generally a problem, since the edge of the polygon is infinitely thin anyway, and points that fall right on the edge can go either way without hurting the look of the polygon.)




 
Các thành viên đã Thank dieuhb vì Bài viết có ích:
06/04/2012 09:04 # 13
dieuhb
Cấp độ: 3 - Kỹ năng: 3

Kinh nghiệm: 0/30 (0%)
Kĩ năng: 14/30 (47%)
Ngày gia nhập: 04/02/2010
Bài gởi: 30
Được cảm ơn: 44
Phản hồi: Các bài luyện tập cho OLP 2012


 Bài số 5
NUMBER1.CPP - NUMBER1.JAVA
Cư dân hành tinh Alpha chỉ dùng hai chữ số 3 và 4 để biểu diễn các chữ số của họ. Qui ước: số 1  là 3, số 2 là 4, số 3 là 33, số 4 là 34, số 5 là 43 số 6 là 44, số 7 là 333....
Hãy cho biết số nguyên n ở hành tinh Alpha viết như thế nào. (1<=n<=1000000000000)

 Dữ liệu vào chứa trong file NUMBER1.INP  chứa 1 số nguyên n.  
Kết quả ghi ra file NUMBER1.OUT là biểu diễn của số nguyên n ở hành tinh Alpha.

Yêu cầu: Thời gian thực hiện 2 giây.

Gợi ý:
Với n nhỏ có thể dùng hàng đợi .





 
Các thành viên đã Thank dieuhb vì Bài viết có ích:
06/04/2012 18:04 # 14
vnttqb
Cấp độ: 13 - Kỹ năng: 8

Kinh nghiệm: 5/130 (4%)
Kĩ năng: 39/80 (49%)
Ngày gia nhập: 21/03/2011
Bài gởi: 785
Được cảm ơn: 319
Các bài luyện tập cho OLP 2012


 Em tách riêng ra một topic riêng cho dễ  theo giỏi nha thầy. 


======================================================================================================

Cuộc đời là một dòng sông. Ai không bơi thì chết. 
 

Name: Tien (Tory) TRAN
Email: TranTien29@gmail.com


 
Copyright© Đại học Duy Tân 2010 - 2024