4-ওয়ে স্টপ শিডিয়ুল করুন


14

এগিয়ে যাওয়ার জন্য অপেক্ষা করে একগুচ্ছ গাড়িগুলি 4-ওয়ে স্টপ সাইন ইন সারিবদ্ধভাবে দাঁড়িয়ে আছে। কে আরও যেতে পারে সে সম্পর্কে সবাই বিভ্রান্ত হয়ে পড়েছে, কে কোন দিকে যাচ্ছে, ইত্যাদি স্পষ্টতই সাবঅপটিমাল।

আপনার কাজটি হ'ল একটি অনুকূল ফ্যাশনে স্টপ সাইনটিতে ট্রাফিকের সময়সূচী করা।

আপনি চারটি কার্ডিনাল দিকনির্দেশের প্রত্যেকটির জন্য একটি বারের অনুরোধগুলির 4 টি স্ট্রিং ইনপুট হিসাবে পাবেন। প্রতিটি অনুরোধ হয় Lবাম Sজন্য, সরাসরি বা Rডান জন্য।

LLSLRLS
SSSRRSRLLR
LLRLSR
RRRLLLL

প্রথম সারিটি ছেদ করার উত্তর প্রবেশদ্বারে লাইনআপ। লাইনে প্রথম গাড়ি বাম দিকে ঘুরতে চায় (এটি পূর্ব থেকে প্রস্থান করুন)। পরবর্তী সারিগুলি আগত পূর্ব, দক্ষিণ এবং পশ্চিম প্রবেশদ্বারগুলির জন্য। সুতরাং পশ্চিম থেকে আগত প্রথম গাড়িটি দক্ষিণ থেকে প্রস্থান করার ইচ্ছা করছে।

ট্র্যাফিক কয়েক ধাপে সরানো। প্রতিটি পদক্ষেপে, আপনাকে এগিয়ে যেতে তাদের লাইনগুলির শীর্ষে গাড়িগুলির একটি উপসেট বেছে নিতে হবে। নির্বাচিত গাড়িগুলি একে অপরের সাথে হস্তক্ষেপ করবে না । একই গাড়ি থেকে প্রস্থান করতে বা তাদের অবশ্যই একে অপরের পথ অতিক্রম করতে হবে (দুটি স্ট্যান্ডার্ড ডান হাতের ড্রাইভিংয়ের নিয়ম রয়েছে) যদি দুটি গাড়ি হস্তক্ষেপ করে। সুতরাং দুটি বিপরীত গাড়ি উভয়ই সোজা যেতে চাইছিল একই ধাপে যেতে পারে। সুতরাং 4 টি গাড়ি সমস্ত ডান দিকে যেতে ইচ্ছুক may দুটি বিপরীত গাড়ি উভয় একযোগে বাম দিকে ঘুরতে পারে।

আপনার কাজটি ন্যূনতম কয়েকটি পদক্ষেপের ছেদটি শিডিউল করা। প্রতিটি পদক্ষেপের জন্য, আগত গাড়িগুলির কম্পাস দিকনির্দেশের তালিকাভুক্ত একটি লাইন আউটপুট করুন। উপরের উদাহরণের জন্য, সর্বনিম্ন সময়সূচীটি 14 টি পদক্ষেপ। একটি সর্বনিম্ন সময়সূচীটি হ'ল:

N    [L from North]
E    [S from East]
E    [S from East]
E    [S from East]
NESW [L from North, R from East, L from South, R from West]
NE   [S from North]
EW   [R from East]
NESW [L from North, R from East, L from South, R from West]
W    [L from West]
EW   [L from East, L from West]
NESW [R from North, L from East, R from South, L from West]
NES  [L from North, R from East, L from West]
NS   [S from North, S from South]
SW   [R from South, L from West]

আপনার প্রোগ্রামটি 1 মিনিটের নিচে প্রতিটি লাইনে 50 টি গাড়ি পরিচালনা করতে সক্ষম হবে। 4 টি স্ট্রিং এবং শিডিয়ুলের আউটপুট আপনার ভাষার জন্য কোনও সুবিধাজনক উপায়ে হতে পারে।

সংক্ষিপ্ততম প্রোগ্রামের জয়।

আরও বড় উদাহরণ:

RRLLSSRLSLLSSLRSLR
RLSLRLSLSSRLRLRRLLSSRLR
RLSLRLRRLSSLSLLRLSSL
LLLRRRSSRSLRSSSSLLRRRR

যার জন্য সর্বনিম্ন 38 টি রাউন্ড প্রয়োজন। একটি সম্ভাব্য সমাধান:

E
EW
E
ESW
S
NS
ES
NESW
NSW
ESW
ES
NSW
NS
NS
NW
EW
NSW
NS
EW
NES
EW
NSW
NE
E
NE
EW
E
E
EW
EW
EW
W
ESW
NSW
NSW
NS
NSW
NEW


আপনি প্রথম উদাহরণের জন্য ন্যূনতম সময়সূচীটি কীভাবে গণনা করেছেন? আমি মনে করি এটি একটি বৈধ 13-পদক্ষেপের সময়সূচী: এনএসডাব্লু, এনএসডাব্লু, ইএসডাব্লু,
ইডাব্লু

@ সুলতানিক: আপনার চতুর্থ ধাপ, ইডাব্লু, পূর্বটি সোজা হয়ে গেছে, পশ্চিমের বাঁ দিকে বাঁকছে। এটি কোনও অনুমোদিত কনফিগারেশন নয়।
কিথ র্যান্ডাল

@ ফ্যাটালাইজ: আমার একটি প্রোগ্রাম রয়েছে যা ডায়নামিক প্রোগ্রামিং ব্যবহার করে এটি করে।
কিথ র্যান্ডাল

হ্যাঁ, দুঃখিত। আমি আমার প্রোগ্রামে একটি বাগ ছিল। আমি শীঘ্রই একটি উত্তর পোস্ট করব…
সুলতানিক

উত্তর:


3

পাইথন, 1219 বাইট

আমি এটিকে গল্ফ করার চেষ্টা করে খুব বেশি সময় / প্রচেষ্টা ব্যয় করি নি, তবে অন্য উত্তরগুলি পপ করতে শুরু করলে আমি এটিকে উন্নত করতে পারি। আমি গ্রহণযোগ্য হিউরিস্টিক সহ একটি * অনুসন্ধান ব্যবহার করছি , অনুকূলতার গ্যারান্টি দিচ্ছি। আমি যথেষ্ট নিশ্চিত (যদিও আমি নিশ্চিত করতে বিরক্ত করিনি) যে তাত্ত্বিক এছাড়াও সুসংগত , যার অর্থ এটি (ডায়নামিক প্রোগ্রামিং)।

আপনার নির্দিষ্ট ফর্ম্যাটে প্রোগ্রামটি STDIN থেকে চারটি লাইনে পড়ে এবং আপনার নির্দিষ্ট ফরম্যাটেও ফলাফলটি STDOUT এ মুদ্রণ করে।

from heapq import heappush,heappop
from itertools import combinations
N,E,S,W=range(4)
L="L"
R="R"
T="S"
d=[{L:E,R:W,T:S},{L:S,R:N,T:W},{L:W,R:E,T:N},{L:N,R:S,T:E}]
b=set([(N,S,W,E),(N,S,E,W),(S,N,W,E),(S,N,E,W),(E,W,N,E),(N,S,W,N),(S,N,E,S),(W,E,S,W)])
for x in list(b):b.add(x[2:]+x[:2])
def v(*a):return a[1]!=a[3] and a not in b
i=lambda:raw_input()+'\n'
i=map(lambda l:map(lambda e:("NESW"[l[0]],d[l[0]][e]), l[1]),enumerate((i()+i()+i()+i()).split()))
q=[]
heappush(q,(0,[],i))
while q:
    h,a,n=heappop(q)
    m=sum(map(bool,n))
    if m==0:
        print "\n".join(a)
        break
    for r in range(4,0,-1):
        f=False
        for c in combinations(range(4),r):
            l=True
            for i in c:
                if not n[i]:
                    l=False
                    break
            if not l:continue
            l=True
            for x,y in combinations(c,2):
                if not v(x,n[x][0][1],y,n[y][0][1]):
                    l = False
                    break
            if l==False:continue
            f=True
            e=list(n)
            for i in c:e[i]=e[i][1:]
            heappush(q,(m-r+min(map(len,e)),a+["".join([n[x][0][0] for x in c])],e))
        if f:break

ব্যবহারের উদাহরণ:

$ time echo "RRLLSSRLSLLSSLRSLR\nRLSLRLSLSSRLRLRRLLSSRLR\nRLSLRLRRLSSLSLLRLSSL\nLLLRRRSSRSLRSSSSLLRRRR" | python 4way.py
NES
NEW
NSW
NS
NS
ESW
NS
NES
NEW
NS
NES
NSW
NS
NS
NSW
NW
NS
NS
NS
EW
ES
SW
EW
EW
SW
ES
EW
EW
EW
EW
E
EW
EW
EW
EW
EW
E
EW
echo   0.00s user 0.00s system 38% cpu 0.002 total
python 4way.py  0.02s user 0.01s system 90% cpu 0.030 total
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.