Đây là thuật toán ngây thơ của tôi. Rõ ràng tất cả các truy cập mảng nên tôn trọng kiểm tra giới hạn.
1) Kiểm tra từng màu kiểm tra của lưới, như chỉ trong x giây.s duy nhất trong mô hình sau:
x.x.x.
.x.x.x
x.x.x.
.x.x.x
Scan nó trong dòng đọc (mỗi x chiều ngang, sau đó đi xuống liên tiếp) (gợi ý: % 2
và * 2
sẽ là bạn của bạn ở đây) làm như sau:
1a) Nếu ngói hiện nay là màu sắc tương tự như gạch một thấp hơn và ở bên phải của tôi, nếu một trong các Xs sau cũng có cùng một màu sắc, đó là một ba liên tiếp:
.....
..XX.
.Xx.X
.X.xX
..XX.
1b) Đối với một thấp hơn và bên trái là tương tự:
.....
.XX..
X.xX.
Xx.X.
.XX..
(Tôi sẽ mã hóa vị trí của X thành bù trừ từ ô trung tâm bạn đang kiểm tra - như trong một mảng như {0, -1}, {- 1, 0}, {- 1, 1 } vv)
(Ngoài ra, bạn có thể triển khai từng mảng 5 đến 5 của 1 để kiểm tra tại đây, 0 cho không - tương tự như cách nhìn trong câu trả lời này - và sau đó quét 5 đến 5 mảng trong khi quét trường chơi. Điều này có thể nhanh hơn. Không ý kiến! Bạn phải kiểm tra.)
2) Bây giờ xuống từng cột, từ trên xuống dưới Nếu hai ô liền kề có màu giống nhau, kiểm tra ô hai hoặc cao hơn - nếu có cùng màu, đó là ba trong một hàng:
.
X
.
x
x
.
X
3) tương tự cho các hàng, đọc từ trái sang phải:
.X.xx.X
Lưu ý: tôi không có ý tưởng nếu điều này là nhanh hơn so với thuật toán ngây thơ kiểm tra tất cả các trao đổi có thể xem nếu nó làm cho một trong ba liên tiếp! Sau khi tất cả, cả hai thuật toán là O (n^2), do đó, đó là nhanh hơn sẽ phụ thuộc vào chi tiết thực hiện. Vì vậy, tôi khuyên bạn nên sử dụng hai thứ:
1) Không tối ưu hóa cho đến khi bạn đã triển khai giải pháp và giải pháp quá chậm đối với trường hợp thực tế đang được sử dụng cho những người đang sử dụng.
2) Khi bạn tối ưu hóa, kiểm tra xem bạn đã thực hiện nhanh hơn chưa! (Và cũng đảm bảo rằng nó vẫn hoạt động - không có gì tệ hơn là một tối ưu hóa phá vỡ mã :))
Tất nhiên, điều này không có nghĩa là tối ưu hóa không vui, nhưng không bị lừa khi nghĩ đến việc tối ưu hóa đã đủ nhanh mã đang làm bất cứ điều gì nhưng tập thể dục tâm trí của bạn;)
Tôi không nghĩ rằng điều này là đủ mô tả. Có thể miếng chỉ di chuyển vào không gian trống không? Nếu vậy, có bao nhiêu không gian đó được lấp đầy để bắt đầu? Hoặc, tất cả chúng đều đầy, và các phần trao đổi? Là một trong những di chuyển hợp pháp _only_ trong đó di chuyển tạo ra một 3-trong-một-hàng? Bởi vì nếu không, người chơi có thể tiếp tục di chuyển các mảnh xung quanh cho đến khi mọi thứ trong một số 3-trong-một-hàng? Hoặc là bị hạn chế bởi vì hầu hết các không gian đang chiếm đóng làm cho phong trào bị hạn chế? Vui lòng cho chúng tôi biết thêm chi tiết. Ý tưởng của bạn _does_ có vẻ thông minh mặc dù; Tôi se đưa bạn cai đo! –
@ acheong87 tất cả chúng đều bị chiếm như vậy bạn nói nó là một phần trao đổi và hành động pháp lý duy nhất là việc tạo ra 3 liên tiếp, xin lỗi tôi nên rõ ràng hơn. – mao
Tại sao bạn cần nó hiệu quả? Đối với một lưới 8 * 7, ngay cả một giải pháp ngây thơ sẽ kết thúc trong ít hơn một khung. – Patashu