সি ++, 146 ত্রিভুজ (অংশ 1/2)
চিত্র হিসাবে ফলাফল
অ্যালগরিদমের বিবরণ
এটি সমাধানের স্থানের প্রস্থের প্রথম সন্ধান ব্যবহার করে। প্রতিটি পদক্ষেপে, এটি k
বাক্সে খাপযুক্ত ত্রিভুজগুলির সমস্ত অনন্য কনফিগারেশন দিয়ে শুরু হয় k + 1
এবং কোনও কনফিগারেশনে অব্যবহৃত ত্রিভুজ যুক্ত করার সমস্ত বিকল্পকে গণনা করে ত্রিভুজগুলির সমস্ত অনন্য কনফিগারেশন তৈরি করে ।
অ্যালগোরিদম মূলত একটি বিস্তৃত বিএফএসের সাথে নিখুঁত সর্বাধিক সন্ধান করার জন্য সেট আপ করা হয়। এবং এটি ছোট আকারের জন্য এটি সফলভাবে করে। উদাহরণস্বরূপ, 50x50 এর একটি বাক্সের জন্য, এটি প্রায় 1 মিনিটের মধ্যে সর্বাধিক সন্ধান করে। তবে 1000x1000 এর জন্য সমাধানের স্থানটি অনেক বড়। এটিকে শেষ হতে দেওয়ার জন্য, আমি প্রতিটি পদক্ষেপের পরে সমাধানের তালিকাটি ছাঁটাই করি। সমাধানের সংখ্যাটি একটি কমান্ড লাইন আর্গুমেন্ট দ্বারা দেওয়া হয়। উপরের সমাধানের জন্য, 50 টির মান ব্যবহার করা হয়েছিল। এর ফলে প্রায় 10 মিনিটের রানটাইম হয়েছিল।
মূল পদক্ষেপের রূপরেখাটি দেখতে এই রকম দেখাচ্ছে:
- বাক্সের ভিতরে সম্ভাব্যভাবে ফিট করতে পারে এমন সমস্ত পাইথাগোরীয় ত্রিভুজ তৈরি করুন।
- প্রতিটি 1 টি ত্রিভুজ সহ সমাধানযুক্ত প্রাথমিক সমাধান সেট তৈরি করুন।
- প্রজন্মের উপর লুপ (ত্রিভুজ গণনা)।
- সমাধান সেট থেকে অবৈধ সমাধানগুলি মুছে ফেলুন। এগুলি এমন সমাধান যা বাক্সের অভ্যন্তরে ফিট হয় না বা ওভারল্যাপ হয়।
- যদি সমাধান সেটটি খালি থাকে, তবে আমরা সম্পন্ন হয়েছি। পূর্ববর্তী জেনারেশন থেকে সেট করা সমাধানটিতে ম্যাক্সিমা রয়েছে।
- ট্রিম বিকল্পটি সক্ষম করা থাকলে ট্রিম সলিউশনটি দেওয়া আকারে সেট করে।
- বর্তমান প্রজন্মের সমস্ত সমাধানের উপর লুপ করুন।
- সমাধানের ঘেরে সমস্ত পক্ষের লুপ।
- ঘেরের পাশের সাথে মিলে যাওয়ার পাশের দৈর্ঘ্যের সমস্ত ত্রিভুজগুলি সন্ধান করুন এবং এটি এখনও সমাধানে নেই।
- ত্রিভুজ যুক্ত করার ফলে নতুন সমাধান তৈরি করুন এবং নতুন প্রজন্মের সমাধান সেটটিতে সমাধান যুক্ত করুন।
- সমাধান মুদ্রণ।
পুরো স্কিমের একটি গুরুত্বপূর্ণ দিক হ'ল কনফিগারেশনগুলি সাধারণত একাধিকবার উত্পন্ন হয় এবং আমরা কেবল অনন্য কনফিগারেশনে আগ্রহী। সুতরাং আমাদের একটি অনন্য কী প্রয়োজন যা সমাধানকে সংজ্ঞায়িত করে, যা সমাধান তৈরি করার সময় ব্যবহৃত ত্রিভুজগুলির ক্রম থেকে পৃথক থাকতে হবে। উদাহরণস্বরূপ, কীটির জন্য স্থানাঙ্কগুলি ব্যবহার করা মোটেই কার্যকর হবে না, যেহেতু আমরা একাধিক আদেশে একই সমাধানে পৌঁছালে এগুলি সম্পূর্ণ আলাদা হতে পারে। আমি যা ব্যবহার করেছি তা হ'ল বৈশ্বিক তালিকায় ত্রিভুজ সূচকগুলির সেট, এবং "সংযোজক" অবজেক্টগুলির একটি সেট যা ত্রিভুজগুলি কীভাবে সংযুক্ত রয়েছে তা নির্ধারণ করে। সুতরাং কীটি কেবল টপোলজি এনকোড করে, 2 ডি স্পেসে নির্মাণ আদেশ এবং অবস্থানের চেয়ে পৃথক।
বাস্তবায়নের দিকটি আরও একটি অংশ যা সম্পূর্ণরূপে তুচ্ছ নয় এটি সিদ্ধান্ত নিচ্ছে যে কীভাবে এবং কীভাবে পুরো জিনিসটি প্রদত্ত বাক্সে ফিট করে। আপনি যদি সত্যই সীমানা ঠেলাতে চান তবে বাক্সের ভিতরে ঘোরানোর জন্য এটি স্পষ্টতই প্রয়োজনীয় allow
আমি চেষ্টা করব এবং পরে অংশ 2 তে কোডটিতে কিছু মন্তব্য যুক্ত করব, যদি কেউ এই সমস্ত কীভাবে কাজ করে তার বিশদটি ডুবতে চায়।
অফিসিয়াল পাঠ্য বিন্যাসে ফলাফল in
(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 ভাগে বিভক্ত হয়েছিল।
কোডটি পেস্টবিনেও উপলব্ধ ।