ریاضت


  • محدودیت زمان: ۱۰ ثانیه
  • محدودیت حافظه: ۵۱۲ مگابایت

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

لیتی و دوستان

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

طبق افسانه‌ها می‌دانیم که عشق از آتش، آتش از خون و خون از عشق برتر است.

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

  • سپس به مهرسا یک امتیاز می‌دهد در صورتی که انتخاب روز ii-ام مهرسا از انتخاب روز jj-ام السا برتر باشد.
  • و به السا یک امتیاز می‌دهد در صورتی که انتخاب روز ii-ام السا از انتخاب روز jj-ام مهرسا برتر باشد.
  • ( در ضمن اگر jj مورد نظر پیدا نشود هیچ کسی در آن روز امتیاز نمی‌گیرد )

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

از شما خواسته شده تا به السا کمک کنید و او را راهنمایی کنید تا در هر‌روز چه چیزی برای لیتی بفرستد. ( واقعا از اولش هم این بی‌انصافی ها رواج داشت، دلیلش نامعلومه :/ )

یعنی شما باید برنامه‌ای بنویسید که بتواند استراتژی خوبی برای امتیاز زیادی گرفتن داشته باشد. این استراتژی می‌تواند به حرکات حریف هم مربوط باشد؛ یعنی شما می‌توانید فرض کنید که حریف هم یک برنامه‌ی کامپیوتری است که طبق یک استراتژی دارد با شما بازی می‌کند. برای مثال می‌توانید برنامه‌ای بنویسید که پس از هر مرحله تلاش کند استراتژی حریف را یاد بگیرد و در مراحل بعدی در مقابل حرکات وی خوب عمل کند! اما توجه کنید که ممکن است حریف هم تلاش کند که استراتژی شما را یاد بگیرد، و این‌جاست که سوال جذابیت خاص خود را می‌یابد! :)

پیاده سازی🔗

باید این سوال را به زبان C++ پیاده سازی کنید. دقت کنید که غالب دستورهای زبان C نیز در C++ پشتیبانی می‌شوند.

باید ‍riazat.h را در فایل ‍c++ خود include کنید.

** !! در فایل ارسالی شما نباید تابع int main() وجود داشته باشد !! **

شما باید دو تابع void init() و int next(int prev) را پیاده سازی کنید.

تابع void init() که شما می‌نویسید فقط یک‌بار در ابتدا توسط برنامه اصلی صدا زده می‌شود و شما می‌توانید در بدنه این تابع محاسبات یا پیش‌محاسباتی را که لازم دارید قبل از بازی انجام دهید

تابع int next(int prev) که شما می‌نویسید، به ازای هر‌روز یک‌بار صدا زده می‌شود که ورودی آن نشاندهنده حرکت قبلی حریف است ( اولین باری که تابع صدا زده می‌شود مقدار ورودی برابر -1 خواهد بود و در بقیه گام‌ها 0، 1 یا 2 خواهد بود. )

در پیاده سازی 0 به معنای عشق، 1 به معنای آتش و 2 به معنای خون می‌باشد.

بنابراین کدی که شما خواهید نوشت همانند کد زیر خواهد بود :

#include <bits/stdc++.h>
#include "riazat.h"

void init()
{
  /* YOUR CODE HERE */
}

int next(int previous_opponent_move)
{
  /* YOUR CODE HERE */
  //return 0;
}
Plain text

توجه کنید که شما می‌توانید در هرجای دیگری از این فایل کد مورد نظر خود یا توابع مورد‌نظر خود را بنویسید، اما فقط توابع نامبرده شده از طرف برنامه اصلی صدا زده خواهند شد.

ورودی🔗

این سوال ورودی استاندارد ندارد و شما باید دو تابع ‍void init() و int next() را پیاده سازی کنید.

خروجی🔗

این سوال خروجی استاندارد ندارد و تنها خروجی برنامه شما مقادیر برگردانده شده توسط تابع int next() هستند.

ارسال پاسخ برای این سؤال
در حال حاضر شما دسترسی ندارید.