الگوریتمستان - مسئله کاشیکاری

مثالی از کاربرد الگوریتم‌های تقسیم و حل

✤    ۱۱ آذر ۱۳۸۸

یکی از مسائل جالب طراحی الگوریتم مسئله کاشیکاری یا فرش کردن زمین با موزاییک‌ است. فرض کنید قطعه زمین مربعی شکل با ابعادی از توان عدد دو داریم. هدف فرش کردن این قطعه زمین با استفاده از موزاییک‌هایی با شکل L است به قسمی که یکی از خانه‌های زمین شطرنجی شده فوق پوشیده نشود. می‌توان فرض کرد از این خانه برای احداث باغچه یا حوضچه کوچکی استفاده خواهد شد. در ضمن حق شکستن این موزاییک‌ها به تکه‌های کوچکتر را نداریم.

  

مسئله کاشیکاری

  

به عنوان مثال، فرض کنید زمینی با ابعاد چهار متر داریم که می‌خواهیم خانه مشخص شده زیر پوشیده نشود:

  

مسئله کاشیکاری

  

می‌توان این زمین را به صورت زیر فرش کرد:

  

مسئله کاشیکاری

  

اما راه حل کلی مسئله چیست؟

با توجه به اینکه ابعاد زمین توانی از عدد دو است، روش تقسیم و حل را برای پوشانیدن این قطعه زمین امتحان می‌کنیم. بر اساس تعریف روش تقسیم و حل، باید بتوان مسئله را به زیرمسائلی از نوع خود مسئله تقسیم کرد و با ادغام نتایج حاصل از آنها، به نتیجه اصلی دست پیدا کرد. چون ابعاد این قطعه زمین توانی از عدد دو است، پس می‌توان آن را به دو قسمت تقسیم کرد. با تقسیم طول و عرض زمین به دو قسمت، چهار قطعه زمین کوچکتر به دست می‌آید:

  

مسئله کاشیکاری

  

اما همه این چهار قطعه زمین شرایط مسئله اصلی را دارا نیستند. در صورت مسئله عنوان شده است که باید از پوشانیدن یکی از خانه‌های قطعه زمین صرف نظر کرد. از چهار قطعه زمین کوچکتر تنها یکی از آنها این شرط را برآورده می‌کند و بقیه قطعه زمین‌ها باید به طور کامل پوشانیده شوند. این نقص را می‌توان با به کار بردن یک موزاییک حل کرد:

  

مسئله کاشیکاری

  

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

  

مسئله کاشیکاری

  

اگر قطعه زمین‌های کوچکتر از ابعاد دو باشند، به سادگی با قرار دادن یک موزاییک می‌توان آن را پوشانید:

  

مسئله کاشیکاری

  

پس به طور خلاصه، برای حل مسئله باید به این صورت عمل کنیم:

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

  

مسئله کاشیکاری

  

تعداد موزاییک‌ها

  [برگرد بالا]

یکی از سوالات مهم این است که برای پوشانیدن قطعه زمین با توجه به شرایط مسئله چند موزاییک لازم است؟

فرض کنید $ T(n) $ تعداد موزاییک‌های لازم برای پوشانیدن زمینی با ابعاد n باشد. با توجه به استفاده از روش تقسیم و حل، هر قطعه زمین به چهار قطعه زمین با ابعاد نصف تبدیل می‌شود. اما برای این تبدیل از یک موزاییک استفاده می‌کنیم. پس می‌توان نوشت:

  

\[ T( n ) = 4 T( \frac{n}{2} ) + 1 \]

  

اگر ابعاد قطعه زمین دو متر باشد، تنها یک موزاییک برای پوشانیدن آن کافی است:

  

\[ T( 2 ) = 1 \]

  

پس می‌توان گفت تعداد موزاییک‌های لازم برای پوشش زمینی با ابعاد n از رابطه بازگشتی زیر به دست می‌آید:

  

\[ T( n ) = 4 T( \frac{n}{2} ) + 1 \qquad , \qquad T( 2 ) = 1 \]

  

با حل این رابطه بازگشتی با استفاده از روش‌های متعارف ریاضی نتیجه زیر حاصل می‌شود:

  

\[ T( n ) = \frac{n^2 - 1}{3} \]

  

برای  محاسبه $ T(n) $ راه ساده‌تری هم وجود دارد. در داخل قطعه زمینی با ابعاد n، تعداد n2 خانه مربعی شکل وجود دارد. یکی از این خانه‌ها نباید پوشانیده شود. پس n2 - 1 خانه مربعی شکل کوچک داریم که باید توسط موزاییک‌ها پوشانیده شوند. هر موزاییک نیز سه خانه مربعی شکل کوچک را پوشش می‌دهد. پس در مجموع به $ \frac{n^2 - 1}{3} $ موزاییک نیاز خواهیم داشت.


تا کنون ۶۶ امتیاز ثبت شده
نوشته لایک نداشت؟
 
به اشتراک گذاری نوشته

amasoudfam.ir/l/en546

اشتراک‌گذاری در LinkedIn     اشتراک‌گذاری در Twitter     ارسال با Telegram

نام: *  
پست الکترونیک (محرمانه):
پیام: *  
• بهنام
۱۱ دی ۱۳۸۸، ساعت ۲۲:۱۲

سلااااااام . 06

یک دنیا ممنون

یادمه چند وقت پیش تو مسنجر در مورد منیع برای حل این مسئله مزاحمتون شدم ، فکر نمیکردم یک پست به این الگوریتم تخصیص بدین .

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

بازم یک دنیا تشکر

موفق باشید

۱۱ دی ۱۳۸۸، ساعت ۲۲:۴۳
• مسعود اقدسی‌فام

لطف داری بهنام جان. امیدوارم بتونی از این مطلب استفاده کنی. 01

اگر هم نقص یا جای ابهامی وجود داره خوشحال می شم با من مطرح کنی. 06

• رویا
۵ بهمن ۱۳۸۸، ساعت ۱۵:۱۱

سلام با کمال تشکر از اطلاعات مفید شما

امکان اموزش درخت avl   اضافه کردن گرهها از روی کد ان به زباتن c++وجود دارد؟در هر چهار حالت

ضمنا قبلا از لطف شما کمال تشکر را دارم.

• shima
۱۲ بهمن ۱۳۸۸، ساعت ۱۱:۰۱

mishe algoritme bazie hex o behem bedin?!

• بابک
۱۳ بهمن ۱۳۸۸، ساعت ۱۲:۰۵

اگه یک کتاب جامع برای مسابقات acm معرفی کنید خیلی خوب میشه؟

۱۶ بهمن ۱۳۸۸، ساعت ۱۰:۳۰
• مسعود اقدسی‌فام

بابک خان، انجام شد.

• میلاد خواجوی
۲۶ بهمن ۱۳۸۸، ساعت ۰۹:۲۰

الگوریتم کاشی‌کاری به صورت گرافیکی

http://www3.amherst.edu/~nstarr/trom/puzzle-8by8/

The M-by-N puzzle Trominos، نیاز به ماشین مجازی جاوا

http://www3.amherst.edu/~nstarr/puzzle-mbyn/trominos.html

ممنون، راهنمای خیلی خوبی بود. استفاده بردیم.

۲۶ بهمن ۱۳۸۸، ساعت ۰۹:۳۷
• مسعود اقدسی‌فام

خواهش می کنم. خوشحالم که استفاده کردید. من هم ممنونم بابت معرفی این آدرس. 06

• masood
۸ اردیبهشت ۱۳۸۹، ساعت ۱۱:۵۲

googooli magoooliii shodeh mer30 khak too saret

• PARISA
۱۰ اردیبهشت ۱۳۸۹، ساعت ۱۷:۲۴

عالی بود

• r.z
۲۰ آبان ۱۳۸۹، ساعت ۱۹:۱۳

سلام

خسته نباشید

ببخشید من برنامه ی کامل برای مسئله ی کاشی کاری رو میخواستم اگه میشه برام بنویسید خیلی ممنون چون خیلی بهش احتیاج دارم ممنون03

• محمدرضا
۱۹ دی ۱۳۸۹، ساعت ۰۲:۴۴

عالی بود.با یک بار خوندن متوجه شدم. بی تعارف نوشتنت هم مثل بیانت شیوا و دقیقه، بهت افتخار می کنم. 08

• محمد
۲۳ آذر ۱۳۹۰، ساعت ۱۱:۳۷

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

• sheyda
۱۹ خرداد ۱۳۹۱، ساعت ۱۶:۲۰

060606061206060606

• محمد
۱۸ دی ۱۳۹۱، ساعت ۱۹:۵۳

با سلام و عرض تشکّر به خاطر کار زیباتون در راه اندازی این وب سایت.

باید عرض کنم که هرچند که منابع دیگری هم برای توضیح مساله ی کاشی کاری بود؛ ولی باز هم نیاز به منابع دیگری مثل سایت شما احساس می شه.

چون که آموزش دهنده ای، بیان خاصّ خودش رو داره و ممکنه که من مطلب رو از سایت های دیگه یا جزوه ی استاد نفهمم، ولی از سایت شما بفهمم.

نمونش هم همین کاشی کاری که از اسلایدهای استادم متوجّهش نشدم، ولی از سایت شما متوجّهش شدم. در کُل می خواستم تشکّر کنم ازتون. کارتون واقعاً ارزشمنده.01 06

• سمیه
۷ اردیبهشت ۱۳۹۲، ساعت ۱۹:۰۸

عالی بود

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

• حسین
۳۱ اردیبهشت ۱۳۹۳، ساعت ۰۹:۲۴

سلام

ممنون از سایت خوبتون

خیلی خوبه

اما اگه امکانش هست برنامه c++واسه کاشی کاری رو بذارید تو سایت

• د
۲۳ آذر ۱۳۹۵، ساعت ۱۷:۳۹

0606060606060606060606060606

• م
۲۳ آذر ۱۳۹۵، ساعت ۱۷:۴۰

0808080808080808080808

• مهران
۱۴ اردیبهشت ۱۳۹۶، ساعت ۱۷:۴۱

با سلام و عرض خسته نباشد...میخواستنم منو تو حل این سوال یاری کنیدددممنون میشم....فرض کنید میخواهید یک زمین مستطیل شکل n×2 را با کاشی های 2×1 پر کنیم.این کاشی ها می توانند افقی یا عمودی در زمین مستطیلی قرار گیرند.تعداد حالت های ممکن را به  صورت فرمولی برحسب n بیابید...

۱۵ اردیبهشت ۱۳۹۶، ساعت ۱۵:۴۱
• مسعود اقدسی‌فام

سلام

اگر فرض کنیم طول زمین n و عرض 2 باشه، یه حالت این هست که یه کاشی رو در عرض قرار بدید و مسأله تبدیل می‌شه به پوشوندن صفحه‌ای به طول n-1. یه حالت دیگه اینه که دو کاشی رو کنار هم قرار بدید و مسأله تبدیل شه به پوشوندن صفحه‌ای به طول n-2. خود این دو کاشی هم به دو روش می‌شه قرار داد.

کل مسأله تبدیل به یک رابطه‌ی بازگشتی می‌شه که به دو جمله‌ی قبلی خودش وابسته هست.

• فاطمه
۲۱ اردیبهشت ۱۳۹۶، ساعت ۱۹:۱۵

سلام.ببخید میخواستم ببینم کد کاشی کاری یه زمین مستطیل شکل 2 در n با کاشی های 2*1 چه جوری میشه؟؟؟

• امیر
۱۴ آذر ۱۳۹۶، ساعت ۰۲:۰۹

عالی ،یعنی خیلی این مسئله رو که اصلن نمی فهمیدم الان میبینم چقد آسون بوده !

۱۸ آذر ۱۳۹۶، ساعت ۰۱:۱۷
• مسعود اقدسی‌فام

خوشحالم که نوشته براتون مفید بوده. 01

موفق باشید.

• Abolfazl Amiri
۲۵ فروردین ۱۳۹۸، ساعت ۲۳:۱۳

میتونید پیاده سازی های پایتون و جاوا اسکریپت رو اینجا https://abolfazlamiri.ir/triomino_tiling/ ببینید.

• تتتت
۲۱ آبان ۱۳۹۸، ساعت ۱۹:۳۴

ح

• تتتت
۲۱ آبان ۱۳۹۸، ساعت ۱۹:۳۶

منم موندم تو تمرین .یکی بنویسه .یک تابع بازگشتی بنویسید که نمرات ۱۰دانشجو را دریافت کرده و مجموع انهارا برگرداند

• سینا
۲۰ اردیبهشت ۱۴۰۰، ساعت ۲۰:۳۰

با سلام و عرض ادب و  خسته نباشید میخواستنم من را  تو حل این سوال یاری کنیدددممنون میشم....

می خواهیم یک زمین شطرنجی n*n که n=2k و K>1 است را با کاشی هاي به شکل L فرش کنیم به طوري فقط می تواند یک خانه خالی وجود داشته باشد. یک الگوریتم به روش تقسیم و حل براي حل این مسئله بیابید؟

• نگین
۹ خرداد ۱۴۰۲، ساعت ۰۹:۳۴

خیلی خیلی ممنون از این توضیحات ساده و عالی و شکل هایی‌ که استفاده کردید و فهم توضیحات رو دو چندان کرد

موفق باشید 06