Lịch trình dừng 4 chiều


14

Một loạt các xe được xếp hàng tại biển báo dừng 4 chiều đang chờ để tiếp tục. Mọi người đều bối rối về việc ai sẽ đi tiếp, ai sẽ đi theo con đường nào, v.v ... Rõ ràng là không tối ưu.

Công việc của bạn là lên lịch giao thông tại biển báo dừng theo cách tối ưu.

Bạn nhận được 4 chuỗi yêu cầu đầu vào, một chuỗi cho mỗi trong bốn hướng chính. Mỗi yêu cầu là Lcho trái, Scho thẳng hoặc Rcho phải.

LLSLRLS
SSSRRSRLLR
LLRLSR
RRRLLLL

Hàng đầu tiên là đội hình ở lối vào phía Bắc đến ngã tư. Chiếc xe đầu tiên trong dòng muốn rẽ trái (nghĩa là thoát khỏi hướng Đông). Các hàng tiếp theo dành cho lối vào Đông, Nam và Tây sắp tới. Vì vậy, chiếc xe đầu tiên đến từ phương Tây muốn thoát khỏi miền Nam.

Giao thông di chuyển trong một loạt các bước. Ở mỗi bước, bạn phải chọn một tập hợp con của những chiếc xe ở đầu dòng của chúng để tiến hành. Những chiếc xe được chọn không được can thiệp lẫn nhau. Hai chiếc xe can thiệp nếu chúng thoát cùng hướng hoặc nếu chúng phải băng qua đường của nhau (đưa ra quy tắc lái xe bên phải tiêu chuẩn). Vì vậy, hai chiếc xe đối diện cả hai muốn đi thẳng có thể đi cùng một bước. Vì vậy, có thể tất cả 4 chiếc xe muốn rẽ phải. Hai chiếc xe đối diện có thể rẽ trái cùng một lúc.

Công việc của bạn là lên lịch cho giao lộ trong một loạt các bước tối thiểu. Đối với mỗi bước, hãy xuất một dòng có (các) hướng la bàn của ô tô đến được liệt kê. Đối với ví dụ trên, lịch trình tối thiểu là 14 bước. Một lịch trình tối thiểu là:

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]

Chương trình của bạn sẽ có thể xử lý 50 chiếc xe trong mỗi dòng trong vòng dưới 1 phút. Đầu vào của 4 chuỗi và đầu ra của lịch biểu có thể theo bất kỳ cách thuận tiện nào cho ngôn ngữ của bạn.

Chương trình ngắn nhất sẽ thắng.

Một ví dụ lớn hơn:

RRLLSSRLSLLSSLRSLR
RLSLRLSLSSRLRLRRLLSSRLR
RLSLRLRRLSSLSLLRLSSL
LLLRRRSSRSLRSSSSLLRRRR

trong đó yêu cầu tối thiểu 38 vòng. Một giải pháp khả thi:

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


Làm thế nào bạn tính toán lịch trình tối thiểu cho ví dụ đầu tiên? Tôi nghĩ rằng đây là một lịch trình gồm 13 bước hợp lệ: NSW, NSW, ESW, EW, EW, NES, NE, EW, NE, NEW, NS, ES, E
ESultanik 14/07/2015

@ESultanik: bước thứ 4 của bạn, EW, có hướng Đông đi thẳng, hướng Tây rẽ trái. Đó không phải là một cấu hình được phép.
Keith Randall

@Firthize: Tôi có một chương trình sử dụng lập trình động.
Keith Randall

À vâng, xin lỗi về điều đó. Tôi đã có một lỗi trong chương trình của tôi. Tôi sẽ đăng một câu trả lời ngắn gọn
ESultanik

Câu trả lời:


3

Python, 1219 byte

Tôi đã không dành nhiều thời gian / nỗ lực để chơi golf này, nhưng tôi có thể cải thiện nó nếu các câu trả lời khác bắt đầu bật lên. Tôi sử dụng tìm kiếm A * với một heuristic đáng ngưỡng mộ, đảm bảo sự lạc quan. Tôi khá chắc chắn (mặc dù tôi không bận tâm xác nhận) rằng heuristic cũng nhất quán , nghĩa là đó là O (lập trình động).

Chương trình đọc bốn dòng từ STDIN theo định dạng bạn đã chỉ định và in kết quả sang STDOUT, cũng theo định dạng bạn đã chỉ định.

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

Ví dụ sử dụng:

$ 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.