دستگاهی مانند شکل زیر را در نظر بگیرید:
در هر یک از ورودیهای ۱، ۲ و ۳ میتوانیم یک گلوله بیندازیم. این گلوله بهسوی پایین حرکت میکند و با توجه به وضعیت کلیدهای x، y و z از یکی از خروجیهای A، B یا C خارج میشود. کلیدهای x، y و z به این صورت عمل میکنند: هر کلید میتواند در یکی از دو وضعیت ↘ یا ↙ باشد. اگر کلید در وضعیت ↘ باشد، گلوله را به سمت راست و اگر در وضعیت ↙ باشد، گلوله را به سمت چپ میفرستد. علاوه بر این با عبور هر گلوله از یک کلید، وضعیت آن کلید تغییر میکند.
در ابتدای شروع کار دستگاه، هر سه کلید در وضعیت هستند. یک دنباله مانند a1a2…an، (ai∈{1,2,3} برای هر i) بهعنوان دنبالهی ورودی دستگاه داده میشود. پس از این ابتدا یک گلوله از ورودی شمارهی a1٬ سپس یک گلوله از ورودی شمارهی a2٬ … و در انتها یک گلوله از ورودی شمارهی an به درون دستگاه میاندازیم. فرض میکنیم که گلولهها به ترتیب از خروجیهای ٬b2٬b1 ، … و bn خارج شوند (bi∈{A,B,C} برای هر i). دنبالهی b1b2…bn را دنبالهی خروجی دستگاه برای ورودی a1a2…an مینامیم.
به عنوان مثال دنبالهی خروجی دستگاه برای ورودی ۱۲۳۲۱، دنبالهی ABBCA است.
الف) الگوریتمی بنویسید که با دریافت یک دنبالهی ورودی، دنبالهی خروجی آن را پیدا کند.
ب)الگوریتمی بنویسید که با دریافت یک دنبالهی s1s2…sn (si∈{A,B,C} برای هر i) مشخص کند که آیا این دنباله میتواند خروجی دستگاه باشد یا خیر؟ الگوریتم شما باید سریع باشد، یعنی امتحان کردن تمام حالتها مورد نظر نیست.
ٰٰ