cuốn sách gpt4 ai đã làm

thuật toán - Phủ hình chữ nhật

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 02:17:36 hai mươi bốn 4
mua khóa gpt4 Nike

tôi có N Một hình chữ nhật có các cạnh song song với trục x và trục y. Có một hình chữ nhật khác,Người mẫu. Tôi cần tạo một thuật toán để xác định Người mẫu Liệu nó có hoàn toàn N bìa hình chữ nhật.

Tôi có một số ý tưởng. Tôi nghĩ trước tiên tôi cần sắp xếp các hình chữ nhật theo bên trái (có thể tìm thấy trong O(n log n) thời gian), sau đó sử dụng các đường quét dọc.

+------------------------------------------------ ----------> x
|O
| +----+
| +----------+ |
|
| +-++----+-+|
|
+------+ +-------++
| +----------+
|
|
|
|y

Hình chữ nhật màu xanh làNgười mẫu.

Đầu tiên, tôi cần tóm tắt thuật toán. Không có yêu cầu đặc biệt để thực hiện. Một hình chữ nhật có thể được biểu diễn dưới dạng một cặp điểm (góc trên bên trái và góc dưới bên phải).

Đây là một trong những nhiệm vụ chuẩn bị cho kỳ thi. Thuật toán tốt nhất mà tôi biết có thể được tìm thấy trong O(n log n) Hoàn thành trong thời gian.

câu trả lời hay nhất

Đây là một thuật toán phân chia và chinh phục. Độ phức tạp của trường hợp TRUNG BÌNH là rất tốt, tôi có thể nói nó tương tự như O(n log MaxCoords). Mặc dù trường hợp xấu nhất có thể là phương trình bậc hai, nhưng tôi nghĩ sẽ khó tạo ra một bài kiểm tra như vậy. Để làm cho việc này khó hơn, hãy sắp xếp thứ tự các lệnh gọi hàm đệ quy một cách ngẫu nhiên. Có lẽ trung bình đề xuất của @ Larry có thể đạt được O(n log n).

Tôi không thể nghĩ ra giải pháp quét dòng, nhưng đối với các thử nghiệm tôi đã thử, nó khá nhanh.

Về cơ bản, hãy sử dụng hàm đệ quy trên hình chữ nhật màu xanh. Trước tiên hãy kiểm tra xem hình chữ nhật màu xanh có bị bao phủ hoàn toàn bởi một trong các hình chữ nhật khác hay không. Nếu vậy thì chúng ta đã xong việc. Nếu không, hãy chia nó thành 4 góc phần tư và gọi các hàm đệ quy trên các góc phần tư đó. Tất cả 4 lệnh gọi đệ quy đều phải trả về true. Tôi đã bao gồm một số mã C# để vẽ hình chữ nhật. Bạn cũng có thể thay đổi nó để sử dụng các giá trị lớn hơn, nhưng trong trường hợp này hãy loại bỏ các quá trình vẽ vì chúng sẽ tồn tại mãi mãi. Tôi đã thử nghiệm nó với một triệu hình chữ nhật được tạo và một hình vuông có một tỷ cạnh để nó không bị ghi đè và câu trả lời được cung cấp (SAI) mất khoảng một giây trên lõi tứ.

Tôi chủ yếu thử nghiệm điều này trên dữ liệu ngẫu nhiên, nhưng có vẻ như nó đúng. Nếu không phải như vậy tôi sẽ xóa nó, nhưng có thể nó sẽ đưa bạn đi đúng hướng.

lớp một phần công khai Form1 : Biểu mẫu
{
Mẫu công khai1()
{
InitializeComponent();
}

Danh sách Rects = Danh sách mới();

const riêng tư int maxRects = 20;

khoảng trống riêng tư InitRects()
{
Rand ngẫu nhiên = Random mới();

for (int i = 0; i < maxRects; ++i) // Rects[0] là mô hình
{
int x = rand.Next(panel1.Width);
int y = rand.Next(panel1.Height);

Rects.Add(hình chữ nhật mới(điểm mới(x, y), kích thước mới(rand.Next(panel1.Width - x), rand.Next(panel1.Height - y))));
}
}

void riêng tư DrawRects(Đồ họa g)
{
g.DrawRectangle(Pens.Blue, Rects[0]);
for (int i = 1; i < Rects.Count; ++i)
{
g.DrawRectangle(Pens.Red, Rects[i]);
}
}

bool riêng Giải quyết(Hình chữ nhật R)
{
// nếu có một hình chữ nhật chứa R
for (int i = 1; i < Rects.Count; ++i)
{
if (Rects[i].Contains(R))
{
trả về đúng sự thật;
}
}

if (R.Width <= 3 && R.Height <= 3)
{
trả về sai;
}

Hình chữ nhật UpperLeft = Hình chữ nhật mới(Điểm mới(RX, RY), Kích thước mới(R.Width / 2, R.Height / 2));
Hình chữ nhật UpperRight = Hình chữ nhật mới(Điểm mới(RX + R.Width / 2 + 1, RY), Kích thước mới(R.Width / 2, R.Height / 2));
Hình chữ nhật LowerLeft = Hình chữ nhật mới(Điểm mới(RX, RY + R.Height / 2 + 1), Kích thước mới(R.Width / 2, R.Height / 2));
Hình chữ nhật LowerRight = Hình chữ nhật mới(Điểm mới(RX + R.Width / 2 + 1, RY + + R.Height / 2 + 1), Kích thước mới(R.Width / 2, R.Height / 2));

return Giải(UpperLeft) && Giải(UpperRight) && Giải(LowerLeft) && Giải(LowerRight);
}

void riêng tư Go_Click(người gửi đối tượng, EventArgs e)
{
Đồ họa g = panel1.CreateGraphics();
panel1.Hide();
bảng1.Show();
Rects.Clear();

InitRects();
DrawRects(g);

textBox1.Text = Giải(Rects[0]).ToString();
}

Về thuật toán - bao phủ hình chữ nhật, chúng tôi tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/2628118/

hai mươi bốn 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress