กำหนดเวลาหยุด 4 ทิศทาง


14

มีรถยนต์หลายคันเรียงกันที่ป้ายหยุดรถ 4 ทิศทางที่รอดำเนินการต่อ ทุกคนสับสนว่าใครจะไปต่อใครจะไปทางไหน ฯลฯ เห็นได้ชัดว่าไม่ดี

งานของคุณคือกำหนดเวลาการรับส่งข้อมูลที่ป้ายหยุดในแบบที่ดีที่สุด

คุณได้รับเป็นคำขอเข้าสาย 4 ของคำขอเลี้ยวหนึ่งอันสำหรับแต่ละทิศทางของทั้งสี่ทิศทาง แต่ละคำขอมีทั้งLซ้ายขวาSหรือRขวา

LLSLRLS
SSSRRSRLLR
LLRLSR
RRRLLLL

แถวแรกคือแถวที่ทางเข้าทิศเหนือถึงสี่แยก รถคันแรกในแนวต้องการเลี้ยวซ้าย (นั่นคือออกจากตะวันออก) แถวถัดมาเป็นทางเข้าตะวันออก, ใต้และตะวันตก ดังนั้นรถคันแรกที่มาจากทางตะวันตกต้องการที่จะออกจากทางทิศใต้

การจราจรเคลื่อนที่เป็นขั้นตอน ในแต่ละขั้นตอนคุณต้องเลือกชุดย่อยของรถยนต์ที่ส่วนหัวของเส้นเพื่อดำเนินการต่อ รถยนต์ที่เลือกต้องไม่รบกวนซึ่งกันและกัน รถสองคันรบกวนถ้าพวกเขาออกจากทิศทางเดียวกันหรือถ้าพวกเขาต้องข้ามเส้นทางของกันและกัน (กำหนดกฎการขับขี่ทางขวามือมาตรฐาน) ดังนั้นรถสองคันที่ตรงกันข้ามซึ่งทั้งคู่ปรารถนาจะไปทางตรงอาจไปในขั้นตอนเดียวกัน ดังนั้นรถ 4 คันทุกคนอาจต้องการเลี้ยวขวา รถสองฝั่งตรงข้ามทั้งคู่สามารถเลี้ยวซ้ายพร้อมกันได้

งานของคุณคือการจัดตารางทางแยกในขั้นตอนต่อเนื่องขั้นต่ำ สำหรับแต่ละขั้นตอนให้ส่งสัญญาณออกตามทิศทางเข็มทิศของรถยนต์ที่เข้ามา สำหรับตัวอย่างข้างต้นกำหนดการน้อยที่สุดคือ 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]

โปรแกรมของคุณควรจะสามารถจัดการ 50 คันในแต่ละบรรทัดภายในไม่ถึง 1 นาที การป้อนข้อมูลของ 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

6
ฉันสามารถติดตั้งวงเวียนแทนได้หรือไม่?
Digital Trauma

คุณคำนวณกำหนดการขั้นต่ำสำหรับตัวอย่างแรกได้อย่างไร ฉันคิดว่านี่เป็นตารางเวลาที่ถูกต้อง 13 ขั้นตอน: NSW, NSW, ESW, EW, EW, NES, NE, EW, NE, ใหม่, NS, ES, E
ESultanik

@ESultanik: ขั้นตอนที่ 4 ของคุณ EW มีทิศตะวันออกไปทางตะวันตกเลี้ยวซ้าย นั่นไม่ใช่การกำหนดค่าที่ได้รับอนุญาต
Keith Randall

@ กระชับ: ฉันมีโปรแกรมที่ใช้การเขียนโปรแกรมแบบไดนามิก
Keith Randall

ใช่แล้วขอโทษด้วย ฉันมีข้อบกพร่องในโปรแกรมของฉัน ฉันจะโพสต์คำตอบในไม่ช้า ...
ESultanik

คำตอบ:


3

Python 1219 ไบต์

ฉันไม่ได้ใช้เวลามากในการพยายามเล่นกอล์ฟ แต่ฉันอาจปรับปรุงถ้าคำตอบอื่น ๆ เริ่มโผล่ขึ้นมา ผมใช้ค้นหา *กับการแก้ปัญหาที่ยอมรับรับประกัน optimality ฉันค่อนข้างแน่ใจ (แม้ว่าฉันไม่ได้ใส่ใจที่จะยืนยัน) ว่าการแก้ปัญหาด้วยวิธีนี้สอดคล้องกันซึ่งหมายความว่ามันเป็นO (การเขียนโปรแกรมแบบไดนามิก)

โปรแกรมอ่านเป็นสี่บรรทัดจาก 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.