C ++, 146 สามเหลี่ยม (ตอนที่ 1/2)
ผลลัพธ์เป็นรูปภาพ
คำอธิบายอัลกอริทึม
สิ่งนี้ใช้การค้นหาพื้นที่โซลูชันอย่างกว้าง ๆ ในแต่ละขั้นตอนมันเริ่มต้นด้วยการกำหนดค่าเฉพาะของk
สามเหลี่ยมที่พอดีในกล่องและสร้างการกำหนดค่าที่ไม่ซ้ำกันทั้งหมดของk + 1
สามเหลี่ยมโดยการแจกแจงตัวเลือกทั้งหมดของการเพิ่มสามเหลี่ยมที่ไม่ได้ใช้ลงในการกำหนดค่าใด ๆ
อัลกอริทึมถูกตั้งค่าโดยทั่วไปเพื่อค้นหาค่าสูงสุดที่แน่นอนด้วย BFS ที่ครบถ้วนสมบูรณ์ และมันก็ทำเช่นนั้นได้สำเร็จสำหรับขนาดที่เล็กกว่า ตัวอย่างเช่นสำหรับกล่องขนาด 50x50 จะพบค่าสูงสุดในเวลาประมาณ 1 นาที แต่สำหรับ 1,000x1000 พื้นที่การแก้ปัญหานั้นใหญ่เกินไป เพื่ออนุญาตให้ยกเลิกฉันจะตัดรายการโซลูชันหลังจากแต่ละขั้นตอน จำนวนโซลูชันที่ถูกเก็บไว้ถูกกำหนดโดยอาร์กิวเมนต์บรรทัดคำสั่ง สำหรับวิธีการแก้ปัญหาข้างต้นจะใช้ค่า 50 ซึ่งส่งผลให้รันไทม์ประมาณ 10 นาที
โครงร่างของขั้นตอนหลักมีลักษณะดังนี้:
- สร้างสามเหลี่ยมพีทาโกรัสทั้งหมดที่อาจบรรจุอยู่ในกล่อง
- สร้างชุดโซลูชันเริ่มต้นประกอบด้วยโซลูชันที่มี 1 สามเหลี่ยมแต่ละชุด
- วนรอบรุ่น (นับสามเหลี่ยม)
- กำจัดโซลูชันที่ไม่ถูกต้องออกจากชุดโซลูชัน เหล่านี้เป็นวิธีการแก้ปัญหาที่ไม่พอดีภายในกล่องหรือมีการทับซ้อนกัน
- หากชุดโซลูชันว่างเปล่าเราจะดำเนินการให้เสร็จสิ้น ชุดโซลูชันจากรุ่นก่อนหน้ามีค่าสูงสุด
- การตัดแต่งกำหนดให้ขนาดที่กำหนดถ้าเปิดใช้งานตัวเลือกการตัดแต่ง
- วนรอบโซลูชันทั้งหมดในยุคปัจจุบัน
- วนรอบทุกด้านในขอบเขตของการแก้ปัญหา
- ค้นหาสามเหลี่ยมทั้งหมดที่มีความยาวด้านตรงกับด้านปริมณฑลและยังไม่ได้แก้ปัญหา
- สร้างโซลูชั่นใหม่ที่เกิดจากการเพิ่มสามเหลี่ยมและเพิ่มโซลูชันลงในชุดโซลูชันของคนรุ่นใหม่
- โซลูชั่นการพิมพ์
สิ่งสำคัญอย่างหนึ่งในโครงร่างทั้งหมดคือการกำหนดค่าโดยทั่วไปจะถูกสร้างขึ้นหลายครั้งและเราสนใจเฉพาะการกำหนดค่าที่ไม่ซ้ำกัน ดังนั้นเราต้องการคีย์เฉพาะที่กำหนดวิธีการแก้ปัญหาซึ่งจะต้องเป็นอิสระจากคำสั่งของรูปสามเหลี่ยมที่ใช้ในขณะที่สร้างวิธีการแก้ปัญหา ตัวอย่างเช่นการใช้พิกัดสำหรับคีย์จะไม่ทำงานเลยเนื่องจากอาจแตกต่างกันอย่างสิ้นเชิงหากเรามาถึงวิธีการแก้ปัญหาเดียวกันในหลายคำสั่งซื้อ สิ่งที่ฉันใช้คือชุดของดัชนีรูปสามเหลี่ยมในรายการส่วนกลางรวมทั้งชุดของวัตถุ "ตัวเชื่อมต่อ" ที่กำหนดวิธีการเชื่อมต่อรูปสามเหลี่ยม ดังนั้นกุญแจเข้ารหัสเฉพาะโทโพโลยีโดยไม่ขึ้นกับลำดับการก่อสร้างและตำแหน่งในพื้นที่ 2D
ในขณะที่ด้านการใช้งานมากขึ้นส่วนอื่นที่ไม่สำคัญทั้งหมดจะตัดสินใจว่าและสิ่งทั้งหมดพอดีกับกล่องที่กำหนด หากคุณต้องการที่จะผลักดันขอบเขตมันเป็นสิ่งจำเป็นที่เห็นได้ชัดเพื่อให้การหมุนเพื่อให้พอดีกับภายในกล่อง
ฉันจะลองและเพิ่มความคิดเห็นลงในรหัสในตอนที่ 2 ในภายหลังในกรณีที่ใครบางคนต้องการดำดิ่งลงไปในรายละเอียดของการทำงานทั้งหมดนี้
ผลลัพธ์ในรูปแบบข้อความอย่างเป็นทางการ
(322.085, 641.587) (318.105, 641.979) (321.791, 638.602)
(318.105, 641.979) (309.998, 633.131) (321.791, 638.602)
(318.105, 641.979) (303.362, 639.211) (309.998, 633.131)
(318.105, 641.979) (301.886, 647.073) (303.362, 639.211)
(301.886, 647.073) (297.465, 638.103) (303.362, 639.211)
(301.886, 647.073) (280.358, 657.682) (297.465, 638.103)
(301.886, 647.073) (283.452, 663.961) (280.358, 657.682)
(301.886, 647.073) (298.195, 666.730) (283.452, 663.961)
(301.886, 647.073) (308.959, 661.425) (298.195, 666.730)
(301.886, 647.073) (335.868, 648.164) (308.959, 661.425)
(335.868, 648.164) (325.012, 669.568) (308.959, 661.425)
(308.959, 661.425) (313.666, 698.124) (298.195, 666.730)
(313.666, 698.124) (293.027, 694.249) (298.195, 666.730)
(313.666, 698.124) (289.336, 713.905) (293.027, 694.249)
(298.195, 666.730) (276.808, 699.343) (283.452, 663.961)
(335.868, 648.164) (353.550, 684.043) (325.012, 669.568)
(303.362, 639.211) (276.341, 609.717) (309.998, 633.131)
(276.808, 699.343) (250.272, 694.360) (283.452, 663.961)
(335.868, 648.164) (362.778, 634.902) (353.550, 684.043)
(362.778, 634.902) (367.483, 682.671) (353.550, 684.043)
(250.272, 694.360) (234.060, 676.664) (283.452, 663.961)
(362.778, 634.902) (382.682, 632.942) (367.483, 682.671)
(382.682, 632.942) (419.979, 644.341) (367.483, 682.671)
(419.979, 644.341) (379.809, 692.873) (367.483, 682.671)
(353.550, 684.043) (326.409, 737.553) (325.012, 669.568)
(353.550, 684.043) (361.864, 731.318) (326.409, 737.553)
(353.550, 684.043) (416.033, 721.791) (361.864, 731.318)
(416.033, 721.791) (385.938, 753.889) (361.864, 731.318)
(385.938, 753.889) (323.561, 772.170) (361.864, 731.318)
(385.938, 753.889) (383.201, 778.739) (323.561, 772.170)
(383.201, 778.739) (381.996, 789.673) (323.561, 772.170)
(323.561, 772.170) (292.922, 743.443) (361.864, 731.318)
(323.561, 772.170) (296.202, 801.350) (292.922, 743.443)
(250.272, 694.360) (182.446, 723.951) (234.060, 676.664)
(335.868, 648.164) (330.951, 570.319) (362.778, 634.902)
(330.951, 570.319) (381.615, 625.619) (362.778, 634.902)
(330.951, 570.319) (375.734, 565.908) (381.615, 625.619)
(330.951, 570.319) (372.989, 538.043) (375.734, 565.908)
(323.561, 772.170) (350.914, 852.648) (296.202, 801.350)
(323.561, 772.170) (362.438, 846.632) (350.914, 852.648)
(234.060, 676.664) (217.123, 610.807) (283.452, 663.961)
(217.123, 610.807) (249.415, 594.893) (283.452, 663.961)
(375.734, 565.908) (438.431, 559.733) (381.615, 625.619)
(382.682, 632.942) (443.362, 567.835) (419.979, 644.341)
(443.362, 567.835) (471.667, 606.601) (419.979, 644.341)
(323.561, 772.170) (393.464, 830.433) (362.438, 846.632)
(372.989, 538.043) (471.272, 556.499) (375.734, 565.908)
(372.989, 538.043) (444.749, 502.679) (471.272, 556.499)
(372.989, 538.043) (365.033, 521.897) (444.749, 502.679)
(443.362, 567.835) (544.353, 553.528) (471.667, 606.601)
(544.353, 553.528) (523.309, 622.384) (471.667, 606.601)
(544.353, 553.528) (606.515, 572.527) (523.309, 622.384)
(419.979, 644.341) (484.688, 697.901) (379.809, 692.873)
(444.749, 502.679) (552.898, 516.272) (471.272, 556.499)
(217.123, 610.807) (170.708, 516.623) (249.415, 594.893)
(484.688, 697.901) (482.006, 753.837) (379.809, 692.873)
(484.688, 697.901) (571.903, 758.147) (482.006, 753.837)
(419.979, 644.341) (535.698, 636.273) (484.688, 697.901)
(276.808, 699.343) (228.126, 812.299) (250.272, 694.360)
(228.126, 812.299) (185.689, 726.188) (250.272, 694.360)
(228.126, 812.299) (192.246, 829.981) (185.689, 726.188)
(393.464, 830.433) (449.003, 936.807) (362.438, 846.632)
(393.464, 830.433) (468.505, 926.625) (449.003, 936.807)
(416.033, 721.791) (471.289, 833.915) (385.938, 753.889)
(471.289, 833.915) (430.252, 852.379) (385.938, 753.889)
(350.914, 852.648) (227.804, 874.300) (296.202, 801.350)
(192.246, 829.981) (114.401, 834.898) (185.689, 726.188)
(114.401, 834.898) (155.433, 715.767) (185.689, 726.188)
(217.123, 610.807) (91.773, 555.523) (170.708, 516.623)
(91.773, 555.523) (141.533, 457.421) (170.708, 516.623)
(141.533, 457.421) (241.996, 407.912) (170.708, 516.623)
(141.533, 457.421) (235.365, 394.457) (241.996, 407.912)
(241.996, 407.912) (219.849, 525.851) (170.708, 516.623)
(241.996, 407.912) (304.896, 419.724) (219.849, 525.851)
(91.773, 555.523) (55.917, 413.995) (141.533, 457.421)
(571.903, 758.147) (476.260, 873.699) (482.006, 753.837)
(571.903, 758.147) (514.819, 890.349) (476.260, 873.699)
(571.903, 758.147) (587.510, 764.886) (514.819, 890.349)
(587.510, 764.886) (537.290, 898.778) (514.819, 890.349)
(587.510, 764.886) (592.254, 896.801) (537.290, 898.778)
(587.510, 764.886) (672.455, 761.831) (592.254, 896.801)
(55.917, 413.995) (113.819, 299.840) (141.533, 457.421)
(113.819, 299.840) (149.275, 293.604) (141.533, 457.421)
(544.353, 553.528) (652.112, 423.339) (606.515, 572.527)
(652.112, 423.339) (698.333, 461.597) (606.515, 572.527)
(535.698, 636.273) (651.250, 731.917) (484.688, 697.901)
(651.250, 731.917) (642.213, 756.296) (484.688, 697.901)
(304.896, 419.724) (299.444, 589.636) (219.849, 525.851)
(304.896, 419.724) (369.108, 452.294) (299.444, 589.636)
(304.896, 419.724) (365.965, 299.326) (369.108, 452.294)
(304.896, 419.724) (269.090, 347.067) (365.965, 299.326)
(114.401, 834.898) (0.942, 795.820) (155.433, 715.767)
(114.401, 834.898) (75.649, 947.412) (0.942, 795.820)
(192.246, 829.981) (124.489, 994.580) (114.401, 834.898)
(269.090, 347.067) (205.435, 217.901) (365.965, 299.326)
(205.435, 217.901) (214.030, 200.956) (365.965, 299.326)
(182.446, 723.951) (68.958, 600.078) (234.060, 676.664)
(182.446, 723.951) (32.828, 633.179) (68.958, 600.078)
(652.112, 423.339) (763.695, 288.528) (698.333, 461.597)
(763.695, 288.528) (808.220, 324.117) (698.333, 461.597)
(763.695, 288.528) (811.147, 229.162) (808.220, 324.117)
(652.112, 423.339) (627.572, 321.247) (763.695, 288.528)
(627.572, 321.247) (660.872, 244.129) (763.695, 288.528)
(652.112, 423.339) (530.342, 344.618) (627.572, 321.247)
(652.112, 423.339) (570.488, 453.449) (530.342, 344.618)
(627.572, 321.247) (503.633, 267.730) (660.872, 244.129)
(365.965, 299.326) (473.086, 450.157) (369.108, 452.294)
(365.965, 299.326) (506.922, 344.440) (473.086, 450.157)
(365.965, 299.326) (394.633, 260.827) (506.922, 344.440)
(394.633, 260.827) (537.381, 303.535) (506.922, 344.440)
(811.147, 229.162) (979.067, 234.338) (808.220, 324.117)
(698.333, 461.597) (706.660, 655.418) (606.515, 572.527)
(811.147, 229.162) (982.117, 135.385) (979.067, 234.338)
(982.117, 135.385) (999.058, 234.954) (979.067, 234.338)
(365.965, 299.326) (214.375, 186.448) (394.633, 260.827)
(811.147, 229.162) (803.145, 154.590) (982.117, 135.385)
(803.145, 154.590) (978.596, 102.573) (982.117, 135.385)
(214.375, 186.448) (314.969, 126.701) (394.633, 260.827)
(314.969, 126.701) (508.984, 192.909) (394.633, 260.827)
(314.969, 126.701) (338.497, 88.341) (508.984, 192.909)
(338.497, 88.341) (523.725, 138.884) (508.984, 192.909)
(338.497, 88.341) (359.556, 11.163) (523.725, 138.884)
(808.220, 324.117) (801.442, 544.012) (698.333, 461.597)
(801.442, 544.012) (739.631, 621.345) (698.333, 461.597)
(660.872, 244.129) (732.227, 78.877) (763.695, 288.528)
(660.872, 244.129) (644.092, 40.821) (732.227, 78.877)
(808.220, 324.117) (822.432, 544.659) (801.442, 544.012)
(660.872, 244.129) (559.380, 47.812) (644.092, 40.821)
(660.872, 244.129) (556.880, 242.796) (559.380, 47.812)
(556.880, 242.796) (528.882, 242.437) (559.380, 47.812)
(808.220, 324.117) (924.831, 449.189) (822.432, 544.659)
(924.831, 449.189) (922.677, 652.177) (822.432, 544.659)
(922.677, 652.177) (779.319, 785.836) (822.432, 544.659)
(779.319, 785.836) (696.630, 771.054) (822.432, 544.659)
(779.319, 785.836) (746.412, 969.918) (696.630, 771.054)
(779.319, 785.836) (848.467, 840.265) (746.412, 969.918)
(848.467, 840.265) (889.327, 872.428) (746.412, 969.918)
(746.412, 969.918) (619.097, 866.541) (696.630, 771.054)
(779.319, 785.836) (993.200, 656.395) (848.467, 840.265)
(993.200, 656.395) (935.157, 864.450) (848.467, 840.265)
(993.200, 656.395) (995.840, 881.379) (935.157, 864.450)
(338.497, 88.341) (34.607, 5.420) (359.556, 11.163)
(338.497, 88.341) (189.294, 204.357) (34.607, 5.420)
(189.294, 204.357) (158.507, 228.296) (34.607, 5.420)
(158.507, 228.296) (38.525, 230.386) (34.607, 5.420)
(158.507, 228.296) (41.694, 412.358) (38.525, 230.386)
รหัส
ดูตอนที่ 2 สำหรับรหัส สิ่งนี้แบ่งออกเป็น 2 ส่วนเพื่อแก้ไขข้อ จำกัด ของขนาดโพสต์
รหัสยังมีอยู่บนPastebin