اولین باره که به کاهو میای؟ راهنمای سایت رو حتما بخون!

ورود ثبت‌نام راهنما درباره‌ی کاهو
پرسش‌ها برچسب‌ها کاربر‌ها سوال بپرسید!

آمار پرسش:

  • پرسیده شده: 2014-06-13 03:40:03 -0500
  • مشاهده شده: 11,927 بار
  • بروز شده: 2014-06-14 12:41:10 -0500

پرسش‌های مشابه:

یافتن کوتاه ترین دور در گراف ساده

کد مساله هشت وزیر با استفاده از الگوریتم ژنتیک

مرجع فارسی برای الگوریتم های هندسی و 2sat

تعداد زیردنباله های نا حسابی

کد برای بررسی یک ریختی 2 گراف

کسی جزوه یا سوال خوب برای segment tree داره؟

محاسبه‌ی دفعات چرخیدن n سرباز در یک ردیف

پیدا کردن ترتیبی که اجرای آن میانگین زمانی کمتری داشته باشد

چگونه برنامه نویسی (الگوریتمی) را در حد پیشرفته یاد بگیریم ؟

سوال دوم مرحله سوم دوره 24: عبور از سد دفاعی ایران (حل شد + کد)

نکاتی در مورد نوشتن پاسخ:

در این قسمت می‌تونی به یک پرسش پاسخ بدی. اگه می‌خوای در مورد پرسش بحث و اظهار نظر کنی از قسمت «ثبت نظر» استفاده کن.
پاسخت رو دقیق و کامل بنویس، از عکس استفاده کن و اگه لازمه به منابع (کتاب یا سایت) ارجاع بده.
اگه پرسش یا پاسخ‌ها مفید هستند حتما بهشون رای بده تا پرسش‌ها و پاسخ‌های خوب مشخص بشن.

استفاده از ویرایشگر:

توی قسمت پیش‌نمایش می‌تونی ببینی متنی که نوشتی چجوری روی سایت دیده میشه.
خیلی مهم: برای اینکه به خط بعد بری باید دوتا Enter بزنی.
می‌تونی از تگ‌های معمولی و ساده‌ی html هم استفاده کنی.
با دکمه‌هایی که بالای ویرایش‌گر قرار دارند کلی کار می‌شه کرد. از عکس‌گذاشتن بگیر تا لیست شماره‌دار. حتما امتحان‌شون کن.

علائم ریاضی:

برای نوشتن علائم ریاضی می‌تونی از Mathjax استفاده کنی. راهنمای Mathjax رو از سایت math.stackexchange بخون.
برای نوشتن عبارت ریاضی وسط جمله، اون عبارت رو بین دوتا $ قرار بده.
برای نوشتن عبارت ریاضی تو یه خط جدید اون رو بین دوتا $$ قرار بده.

گذاشتن n وزیر در صفحه ی شطرنج بطوری که همدیگر را تهدید نکنند

7

ورودی (n <= 100)
خروجی: یک حالت که n وزیر در صفحه شطرنج باشند و هیچکدام یکدیگر را تهدید نکنند!

شطرنج الگوریتم برنامه-نویسی
2014-06-13 03:40:03 -0500
پویان 2066 ● 11 ● 18 ● 40
پاک‌کردن   ویرایش سوال
نظرات

http://stackoverflow.com/questions/20024429/n-queens-solutions-c

2014-06-13 03:42:29 -0500 المپیادی

اگه بک ترک جواب میداد که خودم میزدم!!! n صده ها!

2014-06-13 04:25:46 -0500 پویان

:|  

2014-06-13 04:46:48 -0500 المپیادی

این با رندوم زدن جواب می‌ده یعنی اینکه تا یک جای جدول رو رندوم می‌زنی بقیه رو بک‌ترک، محدودیت زمانی می‌خای چقدر باشه؟

2014-06-13 06:13:08 -0500 ع ر م

البته همینطوری که گفتم رندوم بستگی به نحوه کد زدنت داره و کدیم که من الآن دارم زیاد خوب نزدم، البته یه راه دیگه‌ای هم داره بتونی با استفاده از big bishops (سوال ۲۲۱ اس جی یو) بزنی فکر کنم اونطوری بهتر باشه.

2014-06-13 06:22:17 -0500 ع ر م

2 پاسخ

17

این صد وزیر : صد وزیر!
اینم کدش : کد N وزیر!

از روش کوه نوردی یا Hill Climbing استفاده کردم ... این روش خیلی عالی عمل میکنه!
این روش چی میگه؟ کوهنوردی برای مسئله های Minimization و یا Maximization استفاده میشه اینجوری که به هر وضعیت از مسئله یه امتیازی میدیم و هدفمون پیدا کردن وضعیتی با کمترین (یا بیشترین) امتیاز هست. برای مثال تو این مسئله هر وضعیت برابر یک حالت گذاشتن N وزیر در جدول N*Nهست و امتیاز هر وضعیت ( به ازای وضعیت state ، $f(state) $) رو تعریف میکنیم "تعداد جفت وزیر هایی که یکدیگر رو تهدید میکنن". پس هدفمون رسیدن به وضعیت $target$ هست که $f(target) = 0$ .
روش کوهنوردی بسی سادست. اینجوریه :

  1. از یک وضعیت رندوم شروع کن
  2. به بهترین وضعیت همسایه برو (خیلی خیلی حریصانه!)
  3. اگه وضعیت کنونی از وضعیت قبلی بهتر نبود وضعیت قبلی رو خروجی بده (به قله رسیدیم) وگرنه به خط 2 برو!!

همسایه ی یک وضعیت تعریف خاصی نداره و دست خودمونه که چه چیزی باشه. ولی در سرعت رسیدن به جواب تاثیر خیلی مهمی داره. باید یجوری همسایه رو تعریف کنیم که 1) تعداد همسایه ها خیلی زیاد نشه که برنامه کند بشه و 2) خیلی کم نباشه که به هدف دیر برسیم و مهمتر از اون دو تا 3) واقعن احتمالش باشه که ما رو به وضعیت بهتر برسونه.
چرا کوهنوردی؟! برای مثال اگه هر وضعیت 2 همسایه داشته باشه ، ما میتونیم یه نمودار مثل نمودار زیر از وضعیتا درست کنیم که نقطه ها وضعیت هان و خط ها همسایگی رو نشون میدن و ارتفاع برابر امتیاز وضعیت هست :
image description
خیلی واضح نمودار شبیه یه رشته کوه مسخرست. هدفمون رسیدن به اون نقطه قرمزست. کد ما از یک وضعیت رندوم شروع میکنه و بصورت حریصانه کوهنوردی میکنه تا به قله برسه! برای این اسمشو گذاشتن کوهنوردی و برای سوال هایی که تعداد قله های بهینه نسبت به کل قله ها کم نیست (مثل همین N وزیر) بدرد میخوره.

تو کد من همسایه های هر وضعیت وزیر گذاری تعریف شدن وضعیت هایی که با جابجا کردن یک وزیر که مورد تهدید واقع شده بصورت افقی بشون میشه رسید. اینجوری همسایه ها زیاد هستند(از اردر $N^2$) ولی قله ها خیلی محدودند... حالت هایی که با جابجایی یک وزیر نشه بهترشون کرد خیلی کمه، پس احتمال اینکه به جواب نهایی زود برسیم زیاده.

خلاصه اینجوری کار میکنه و تجربه نشون داده که برای $N \le 100$ زیر یک دقیقه جواب میده! $^_^$

2014-06-14 08:03:57 -0500
محمد مهدی 1955 ● 5 ● 12 ● 40
پاک‌کردن   ویرایش پاسخ
نظرات

خیلی هم خوب!!

2014-06-14 08:37:31 -0500 سیدپارسا

بسیار عالی!!! خیلی ممنون!

2014-06-14 08:50:57 -0500 پویان

خیلی ممنون!

2014-06-14 12:45:49 -0500 محمد مهدی

الآن اگر یه N بهش بدیم که جواب نداشته باشه، تا صب فکر میکنه. چه طوری باید جلوی اینو بگیریم؟؟

2014-06-16 01:35:17 -0500 اقاهه

می تونیم بگیم اگه خیلی گشتی و پیدا نکردی بگو احتمالا جواب نداره! (while (!found && !sobh

2014-06-16 11:44:23 -0500 سیدپارسا
0

http://paste.ubuntu.com/7638417/

2014-06-13 06:21:45 -0500
امینه 81 ● 1 ● 1 ● 3
پاک‌کردن   ویرایش پاسخ
نظرات

شما داری همه حالتا رو چاپ می‌کنی و به همین دلیل سرعت میاد پایین به نظر من نهایتا تا ۱۲ ۱۳ یکی از حالتا رو زیر ۱۰ ثانیه جواب میده واسه ۱۰۰ که خیلی میکشه

2014-06-13 06:27:14 -0500 ع ر م

پاسخ شما

فقط در صورتی که پاسخی برای این پرسش دارید، آن را اینجا بنویسید و برای بحث کردن از قسمت «ثبت‌ نظر» استفاده کنید. شما می‌توانید قبل از وارد شدن به سایت پاسخ خود را بنویسید. این پاسخ ذخیره می‌شود و زمانی که شما وارد سایت شدید یا ثبت‌نام کردید منتشر می‌شود.

پیش‌نمایش:

کلیه‌ی حقوق این سایت متعلق به کمیته‌ی ملی المپیاد کامپیوتر است.