Khi đặt tháp phòng thủ như vậy sẽ có những vùng đất không được bảo vệ. Hãy tính số ô vuông lớn nhất mà không được tháp canh bảo vệ.
Ở ví dụ dưới đây vùng đất lớn nhất mà không được tháp canh bảo vệ là 12 ô vuông.
[Input]
Dữ liệu được đọc vào từ file "DEFENSE.INP".
*Dòng đâu tiên chứa 3 số nguyên dương. w - chiều rộng của ma trận lưới các ô vuông. h - chiều cao của ma trận lưới các ô vuông và n là số lượng tháp phòng thủ.
* n dòng tiếp theo là vị trí của các tháp phòng thủ.
[Output]
Ghi số ố vuông lớn nhất không được bảo vệ ra file "DEFENSE.OUT".
[Input sample]
15 8 3
3 8
11 2
8 6
[Output sample]
12
[Giải thuật]
- Các tháp phòng thủ được đặt trên một ma trận mạng lưới và không có 2 tháp nào cùng nằm trên cùng một hàng hay một cột. Thực hiện phép chiếu vuông góc tới 2 trục tọa độ x và y, được tọa tọa độ của các tháp trên trục x và trục y.
- Sắp xếp tọa độ của các tháp phòng thủ theo chiều tăng dần của x và xét hiệu ci = Xi – Xi-1 đây là khoảng cách giữa hai tháp theo trục x.
- Sắp xếp tọa độ của các tháp phòng thủ theo chiều tăng dần của y và xét hiệu di = Yi – Yi-1 đây là khoảng cách giữa hai tháp theo trục y.
- Vùng đất có kích thước w*h, ta có thể đặt thêm một tháp canh tại vị trí [w+1][h+1] để tính khoảng cách từ tháp cuối ( tận cùng bên phải) tới cuối vùng đất.
- Giả sử khu đất không được bảo vệ có kích thước a*b ô vuông, khi đó a <= ci max , b <= di max. Vậy vùng đất lớn nhất mà không được bảo vệ là ci max * di max là lời giải của bài toán.
Chương trình cài đặt:
#include<iostream> #include <cstdio> using namespace std; #define WMAX 40002 #define HMAX 40002 int xAxis[WMAX],yAxis[HMAX]; int main(){ freopen("DEFENSE.INP","r",stdin); freopen("DEFENSE.OUT","w",stdout); int w, h,n; cin>>w>>h>>n; int tempx,tempy; for(int i=0;i<n;i++){ cin>>tempx>>tempy; xAxis[tempx] = 1; yAxis[tempy] = 1; } // đặt 1 tòa tháp vào góc trên bên phải. xAxis[w+1] = 1; yAxis[h+1] = 1; int maxX = 0; int tempMax = 0; for(int i=1;i<= w + 1;i++){ if(xAxis[i]==0){ tempMax++; }else{ if(tempMax > maxX) maxX = tempMax; tempMax = 0; } } int maxY = 0; tempMax =0; for(int i=1;i <= h + 1;i++){ if(yAxis[i]==0){ tempMax++; }else{ if(tempMax > maxY) maxY = tempMax; tempMax = 0; } } cout<<maxX*maxY; return 0; }
0 Comment to "[Bài tập mẫu] Hệ thống phòng thủ."
Post a Comment