PDA

View Full Version : مبتدی: مفهوم الگوریتم مطرح شده و بازی با عناصر آرایه



cmsdqq2
شنبه 26 آبان 1397, 23:24 عصر
دوستان سلام

با الگوریتمی برخوردم که احساس میکنم اشتباه هست. نظر شما چیه؟

سوال میگه اگر n نفر داشته باشیم و بعد به هر کدوم از اونها یک شماره بدیم از 1 تا n، بعدش یکی در میان با شروع از شماره 2 اونها رو حذف کنیم، شماره ی فرد پیروز که باقی میمونده کیه؟



من احساس میکنم این الگوریتم درست نیست یا بهتره بگم شاید من دقیق نمی فهمشش.

رامین مرادی
یک شنبه 27 آبان 1397, 10:38 صبح
تقریبا میشه عکس زیر. ولی خب اگه همیشه از دومی شروع بشه همون اولین نفر همیشه پیروزه . شایدم من اشتباه متوجه شدم.
149291

cmsdqq2
یک شنبه 27 آبان 1397, 14:41 عصر
تقریبا میشه عکس زیر. ولی خب اگه همیشه از دومی شروع بشه همون اولین نفر همیشه پیروزه . شایدم من اشتباه متوجه شدم.
149291


سلام دوست عزیز، ممنونم

من شیوه رو پیدا کردم و فهمیدمش فکر میکنم شما هم همین رو میگید.

فرض کنید n باشه 12. پس یک آرایه درست میشه از 1 تا 12

حالا از شماره 2 شروع میکنه یکی در میان به حذف کردن.

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

2 4 6 8 10 12 حذف میشن. حالا چون یکی در میان بوده پس 1 حذف نمیشه. بعدش هم ادامه پیدا میکنه و 3 7 11 حذف میشن.

تا اینجا باقی مونده ها میشه: 1 5 9

حالا باز چون یکی در میان بوده پس دوباره 1 حذف نمیشه. 5 حذف میشه و درنهایت 9 میمونه.

مرسی ممنونم

الان برای پیاده سازی این الگوریتم چه باید کرد؟ خصوصاً اینکه گفته دور یک میز نشستن.

جلو رفتنش هم دو خونه دو خونه هستش.

پیشنهادی دارین؟

MMR_1234
یک شنبه 27 آبان 1397, 18:39 عصر
دو تا آرایه بساز و اعدادت رو تو آرایه اول بریز
سپس خانه های فرد اون رو تو آرایه دوم بریز و کل آرایه رو حذف کن
مرحله بعد آرایه دوم رو تو آرایه اول بریز و آرایه دوم رو حذف کن
این کار رو تا زمانی که تعداد خونه آرایه یک بشه ادامه بده
البته شاید روش بهتری هم باشه فعلأ این به ذهنم رسید

Mahmoud.Afrad
یک شنبه 27 آبان 1397, 21:04 عصر
این نوع سوالات را با c++ بنویسید.
راهنمایی اینکه بایست یک صف(حلقوی) ایجاد کنید. یکی از اول صف خارج و به آخر صف وارد شود. دومی از صف خارج شود. همینطور ادامه بدید تا فقط یک عنصر در صف باقی بماند

محمد آشتیانی
دوشنبه 28 آبان 1397, 17:09 عصر
کاربردش چی میتونه باشه؟ همیشه خونه اول آرایه به عنوان جواب نهایی باقی میمونه

cmsdqq2
دوشنبه 28 آبان 1397, 17:19 عصر
کاربردش چی میتونه باشه؟ همیشه خونه اول آرایه به عنوان جواب نهایی باقی میمونه


خونه ی اول ابتدایی یا خونه ی اول که در انتها باقی میمونه؟

قطعاً خونه ی اول که در انتها باقی میمونه جواب میشه اما بدست آوردن خونه ی اول که همون جوابه مهم هست.

cmsdqq2
دوشنبه 28 آبان 1397, 17:20 عصر
این نوع سوالات را با C++‎ بنویسید.
راهنمایی اینکه بایست یک صف(حلقوی) ایجاد کنید. یکی از اول صف خارج و به آخر صف وارد شود. دومی از صف خارج شود. همینطور ادامه بدید تا فقط یک عنصر در صف باقی بماند


براتون امکان پذیر هست کمی بیشتر توضیح بدید؟ ممنونم

cmsdqq2
دوشنبه 28 آبان 1397, 17:24 عصر
دو تا آرایه بساز و اعدادت رو تو آرایه اول بریز
سپس خانه های فرد اون رو تو آرایه دوم بریز و کل آرایه رو حذف کن
مرحله بعد آرایه دوم رو تو آرایه اول بریز و آرایه دوم رو حذف کن
این کار رو تا زمانی که تعداد خونه آرایه یک بشه ادامه بده
البته شاید روش بهتری هم باشه فعلأ این به ذهنم رسید

تا جاییکه من میدونم الگوریتم حل باید به این صورت باشه که در یک حلقه، خانه ها رو یکی در میان حذف کنیم. یعنی اول خانه ی 2، بعدش 4، بعدش خانه ی شماره 6، بعدش 8 و تا آخر آرایه اول خانه های زوج حذف بشن. یعنی دو خونه دوخونه باید بریم جلو و حذف کنیم. این روش که شما گفتین درست هست؟

البته شاید هم من نفهمیدم. ممنونم

محمد آشتیانی
دوشنبه 28 آبان 1397, 17:38 عصر
خونه ی اول ابتدایی یا خونه ی اول که در انتها باقی میمونه؟

قطعاً خونه ی اول که در انتها باقی میمونه جواب میشه اما بدست آوردن خونه ی اول که همون جوابه مهم هست.

با این توضیحی که شما فرمودید و مثالی که آقای مرادی زدند ، همواره خونه ابتدایی اول بعنوان جواب باقی میمونه به نظرم ، مگر آنکه بنده متوجه مسئله نشده باشم

mr.sirwan
دوشنبه 28 آبان 1397, 18:41 عصر
ببینین اگر گفته شده باشه که دور یه میز نشستن، الگوریتم حذف افراد، باید یک بار از فرد دوم شروع بشه و دور میز انقدر بچرخه که فقط یک نفر باقی بمونه، یعنی خود عدد 1 رو هم شامل میشه نه اینکه در هر مرحله بیایم عدد یک رو نادیده بگیریم و از عنصر دوم شروع کنیم به حذف، در اینصورت این الگوریتم هیچ کارایی نداره و همیشه عدد یک باقی میمونه، مثال زیر رو مشاهده کنین تا منظورمو بهتر متوجه بشین:
149302

رامین مرادی
سه شنبه 29 آبان 1397, 08:16 صبح
ببینین اگر گفته شده باشه که دور یه میز نشستن، الگوریتم حذف افراد، باید یک بار از فرد دوم شروع بشه و دور میز انقدر بچرخه که فقط یک نفر باقی بمونه، یعنی خود عدد 1 رو هم شامل میشه نه اینکه در هر مرحله بیایم عدد یک رو نادیده بگیریم و از عنصر دوم شروع کنیم به حذف، در اینصورت این الگوریتم هیچ کارایی نداره و همیشه عدد یک باقی میمونه، مثال زیر رو مشاهده کنین تا منظورمو بهتر متوجه بشین:
149302

متاسفانه اینجا گفته نشده دور یک میز هستن. پس یه نظرم نمیشه درست حدس زد که از یه صف حلقه ای استفاده بشه .(تو سوال باید با یه مفهومی حذف شدن حلقه ای اونو ذکر میکرد. اونموقع بعله )


در ضمن فک کنم این روش شما یه جورایی صحیح نیستا(البته اینشالله که من اشتباه میکنم) تو مرحله اول شما که دوازده رو حذف میکنید یک درمیان میفته باز رو عدد دو و چهار و.... که هیچوقت این حلقه تموم نمیشه.
اگه از باقی مونده ها یک درمیان هم حذف بشه مرحله سومتون صحیحه و مرحله آخرتون اشتباه . و باز هم عدد یک میموند.(البته بازم میگم عنوان سوال کامل نیست )

mr.sirwan
سه شنبه 29 آبان 1397, 10:58 صبح
متاسفانه اینجا گفته نشده دور یک میز هستن. پس یه نظرم نمیشه درست حدس زد که از یه صف حلقه ای استفاده بشه .(تو سوال باید با یه مفهومی حذف شدن حلقه ای اونو ذکر میکرد. اونموقع بعله )


در ضمن فک کنم این روش شما یه جورایی صحیح نیستا(البته اینشالله که من اشتباه میکنم) تو مرحله اول شما که دوازده رو حذف میکنید یک درمیان میفته باز رو عدد دو و چهار و.... که هیچوقت این حلقه تموم نمیشه.
اگه از باقی مونده ها یک درمیان هم حذف بشه مرحله سومتون صحیحه و مرحله آخرتون اشتباه . و باز هم عدد یک میموند.(البته بازم میگم عنوان سوال کامل نیست )

البته کوتاهی از ایشون بوده اما در پست سوم تازه اومدن ذکر کردن که دور میز نشستن
درمورد مراحل هم، شما وقتی یه نفر رو حذف میکنی قاعدتا جاش رو میده به باقی مونده ها (یعنی فرض کنین یه میز جدید با افراد باقی مونده تشکیل بدیم)، پس عمل حذف بصورت یک در میان روی باقی مونده ها اجرا میشه، در مرحله 2 بعد از حذف 12 این اعداد باقی میمونن: 1 3 5 7 9 11 که باز هم باید بصورت حلقوی در نظر گرفته بشه و مهمترین نکته اینه که باید دنباله رو عدد 12 باشه، یعنی بعد از حذف عدد 12 عدد 3 باید حذف بشه چون عدد 1 بین این دوتاست و اونو رد میکنیم همچنین اعداد 7 و 11 هم حذف میشن، توی مرحله بعد این اعداد باقی میمونن: 1 5 9 و باز باید دنباله رو عدد 11 شروع به حذف کنیم پس از روی عدد 1 پرش میکنیم میرسیم به عدد 5 که باید حذف بشه، عدد 9 رو رد میکنیم و حالا اعداد باقی مونده 1 و 9 هستن، چون توی مرحله قبل عدد 9 رو رد کردیم پس عدد بعدی که باید حذف بشه عدد 1 هست و در انتها عدد 9 باقی میمونه

cmsdqq2
سه شنبه 29 آبان 1397, 14:58 عصر
ببینین اگر گفته شده باشه که دور یه میز نشستن، الگوریتم حذف افراد، باید یک بار از فرد دوم شروع بشه و دور میز انقدر بچرخه که فقط یک نفر باقی بمونه، یعنی خود عدد 1 رو هم شامل میشه نه اینکه در هر مرحله بیایم عدد یک رو نادیده بگیریم و از عنصر دوم شروع کنیم به حذف، در اینصورت این الگوریتم هیچ کارایی نداره و همیشه عدد یک باقی میمونه، مثال زیر رو مشاهده کنین تا منظورمو بهتر متوجه بشین:
149302



بله دقیقاً گفته ی شما درسته. کاملاً درسته


بنده عذرخواهی میکنم که در پست اول این نکته رو نگفتم که دور یک میز نشستن. بلکه در پست سوم گفتم. لطفاً عذرخواهی من رو بپذیرید.

cmsdqq2
سه شنبه 29 آبان 1397, 15:00 عصر
بله دقیقاً گفته ی شما درسته. کاملاً درسته


بنده عذرخواهی میکنم که در پست اول این نکته رو نگفتم که دور یک میز نشستن. بلکه در پست سوم گفتم. لطفاً عذرخواهی من رو بپذیرید.



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

MMR_1234
چهارشنبه 30 آبان 1397, 23:20 عصر
میتونی دوتا ماتریس در نظر بگیری
خونه های فرد ماتریس اول رو در متاریس دوم بریزی
ماتریس اول پاک بشه و اعداد ماتریس دوم درونش قراربگیره
این کار رو ادامه میدی تا زمانی که تعداد خونه های متریس دو برابر یک بشه