PDA

View Full Version : تولید دنباله از اعداد



havakili
شنبه 24 مرداد 1394, 16:20 عصر
با سلام خدمت همه دوستان

من سوالی از خدمت بزرگوارن دارم و اینکه میخوام یه دنباله ای از جایگشت اعداد بین 1 تا N تولید کنم ولی بدون تکرار اعداد
مثلا برای بازه 1 تا 3 میشه
123
132
213
231
312
321
و این تعداد حالات = N! هستش و میخوام برنامه برای تمامی حالت های جواب بده
صرف نظر از سرعت درستی برنامه مهم هستش
لطفا کمکم کنید

یوسف زالی
دوشنبه 26 مرداد 1394, 10:25 صبح
یکی از روشهاش استفاده از ماتریس متتناظر با گراف کامل و پیدا کردن تمام مسیر های همیلتونی در اونه.

golbafan
دوشنبه 26 مرداد 1394, 10:40 صبح
میتونی از حلقه while استفاده کنی
نوشتنش راحت تره ولی خب ممکنه اجراش کند باشه

اما اگر روش درست تر رو بخوای من الگوریتم هیپ رو پیشنهاد میکنم:


procedure generate(n : integer, A : array of any):
if n = 1 then
output(A)
else
for i := 0; i < n - 1; i += 1 do
generate(n - 1, A)
if n is even then
swap(A[i], A[n-1])
else
swap(A[0], A[n-1])
end if
end for
generate(n - 1, A)
end if

یوسف زالی
دوشنبه 26 مرداد 1394, 10:42 صبح
به نظر می رسه سودوکدی که گذاشتید تکراری بودن رو چک نمی کنه

golbafan
دوشنبه 26 مرداد 1394, 10:53 صبح
در پست قبلی که دادم A یک آرایه هست از کاراکترهایی که میخوای جایگشت کنی: اگر بخوای برای الف تا ی این کار رو انجام بدی پس باید A رو از حروف پر کنی و n رو هم تعداد مورد نیاز از حالت های دلخواهت انتخاب کنی
اگر همه رو بخوای پس
n=(length a)!

golbafan
دوشنبه 26 مرداد 1394, 10:54 صبح
به نظر می رسه سودوکدی که گذاشتید تکراری بودن رو چک نمی کنه

این الگوریتم کد تکراری ایجاد نمیکنه مگر اینکه همه رو تولید کرده باشه

یوسف زالی
دوشنبه 26 مرداد 1394, 11:24 صبح
حواسم به swap نبود.
الگوریتم زیباییه.
من قبلا با روش درخت این کار رو کرده بودم و خیلی سریع بود.

به هر حال به نظرم خیلی درست نیست در تالار دلفی کدهای الگوریتمی بصورت سودو گذاشته بشوند.
سوال های الگوریتمی هم همین طور.