Submission #68711329


Source Code Expand

import bisect, heapq, sys, math, copy, itertools, decimal
from collections import defaultdict, deque
import pprint
sys.setrecursionlimit(10**7)
def INT(): return int(input())
def MI(d=0): return map(lambda x:int(x)+d, input().split())
def MS(): return map(str, input().split())
def LI(d=0): return list(map(lambda x:int(x)+d, input().split()))
def LS(): return list(map(str, input().split()))
def pr_line(itr): print(*itr, sep='\n')
def pr_mtx(matrix): [print(*row) for row in matrix] 
def pr_mtx2(matrix, l=2):
    for row in matrix:
        for x in row:
            print(str(x).rjust(l), end='')
        print('\n')
def pr_stderr(*s): print(*s, file=sys.stderr)

dij = [[1, 0], [0, 1], [-1, 0], [0, -1]]
dij2 = [[1, 0], [0, 1], [-1, 0], [0, -1], [1, 1], [1, -1], [-1, 1], [-1, -1]]
INF = float('inf')
import random

random.seed(1234)

from time import time
base_ms = 0
def tic():
    global base_ms
    base_ms = time()

def toc():
    now = time()
    return (now - base_ms) * 1000

tic()
###########################################################

N, M, K = MI()
Robots_Pos = [LI() for _ in range(M)]
V = [list(map(int, list(input()))) for _ in range(N)]
H = [list(map(int, list(input()))) for _ in range(N-1)]
ULDRS = ['U', 'L', 'D', 'R', 'S']
###########################################################
def output(C, A):
    for c in C:
        print(*c)
    pr_line(A)

def culc_score(A):
    return 3*N**2 - len(A)


def execute(assign, C):
    robots_pos = copy.deepcopy(Robots_Pos)

    A = []
    ###########################################################
    
    Visited = set()
    for i, j in robots_pos:
        Visited.add((i, j))
    ###########################################################

    def move_one_robot(pos, move):
        i, j = pos

        if move == "U":
            if i > 0 and H[i-1][j] == 0:  
                i -= 1
        elif move == "D":
            if i < N-1 and H[i][j] == 0:  
                i += 1
        elif move == "L":
            if j > 0 and V[i][j-1] == 0:  
                j -= 1
        elif move == "R":
            if j < N-1 and V[i][j] == 0:  
                j += 1
        elif move == "S":
            pass  
        
        Visited.add((i, j))
        return (i, j)

    def move_all_robot(k_operation):
        for i in range(M):
            pos = robots_pos[i]
            move = C[k_operation][i]
            ni, nj = move_one_robot(pos, move)
            robots_pos[i] = [ni, nj]
        A.append(k_operation)

    def judge_wall(move, pos):
        i, j = pos
        if move == "U" and H[i-1][j] == 1: return False
        if move == "D" and H[i][j]   == 1: return False
        if move == "L" and V[i][j-1] == 1: return False
        if move == "R" and V[i][j]   == 1: return False
        return True

    def nxt_pos(i, j, move):
        if move == "U": i -= 1
        if move == "D": i += 1
        if move == "L": j -= 1
        if move == "R": j += 1
        return i, j

    visited = [[-1]*N for _ in range(N)]
    def dfs(i, j, d):
        if len(Visited) == N*N: return 0
        
        visited[i][j] = d
        
        flag = False
        for k_ in range(K):
            k = (k_ + 4*(d%2))%8
            if len(Visited) == N*N: return 0
            move = C[k][assign]
            pos = (i, j)
            ni, nj = nxt_pos(i, j, move)
            if 0<=ni<N and 0<=nj<N and (ni, nj) and visited[ni][nj] == -1:
                if not judge_wall(move, pos):
                    continue
                flag = True
                move_all_robot(k)
                #pr_stderr('Visited:', len(Visited))
                done = dfs(ni, nj, d+1)
                if len(Visited) == N*N: return 0
                
                # #行き止まりだった場合は戻らず距離の近い所へ行く
                # if not done:
                #     mn, mnk = INF, -1
                move_all_robot((k+2)%K)
        
        return flag

    dfs(*robots_pos[assign], 0)
    
    return A

def assigned_C(assign):
    C = [['S']*M for _ in range(K)]
    for k in range(K):
        C[k][assign] = ULDRS[k%4]
    return C

def random_C(assign):
    C = [['S']*M for _ in range(K)]
    for k in range(K):
        C[k][assign] = ULDRS[k%4]
        for i in range(M):
            if i != assign:
                C[k][i] = random.choice(ULDRS)
    return C

def select():
    mx_score = 0
    mx_id = -1
    resC, resA = -1, -1
    for i in range(M):
        C = assigned_C(i)
        A = execute(i, C)
        score = culc_score(A)
        if mx_score < score:
            mx_score = score
            mx_id = i
            resC, resA = C, A
    return resC, resA, mx_id

def nxt(C, assign_id):
    k = random.choice(range(K))
    i = random.choice([x for x in range(M) if x != assign_id])
    pre_move = C[k][i]
    C[k][i] = random.choice([move for move in ULDRS if move != pre_move])
    return k, i, pre_move

def back(C, k, i, pre_move):
    C[k][i] = pre_move

def hill_climb():
    _, _, assign_id = select()
    
    solC = random_C(assign_id) # 初期解
    solA = execute(assign_id, solC)
    solScore = culc_score(solA)
    cnt = 0
    while toc() <= 1500:
        cnt += 1
        k, i, pre_move = nxt(solC, assign_id)
        canA = execute(assign_id, solC)
        canScore = culc_score(canA)
        if canScore > solScore:
            solA = canA
            solScore = canScore
        else:
            back(solC, k, i, pre_move)

    pr_stderr('cnt:', cnt)
    return solC, solA
###########################################################
def solve():
    
    resC, resA = hill_climb()

    pr_stderr('score:', culc_score(resA))
    output(resC, resA)

if __name__ == "__main__":
    solve()

Submission Info

Submission Time
Task A - Single Controller Multiple Robots
User BenKenobi
Language Python (PyPy 3.10-v7.3.12)
Score 267844
Code Size 5911 Byte
Status AC
Exec Time 1752 ms
Memory 270784 KiB

Judge Result

Set Name test_ALL
Score / Max Score 267844 / 405000
Status
AC × 150
Set Name Test Cases
test_ALL test_0000.txt, test_0001.txt, test_0002.txt, test_0003.txt, test_0004.txt, test_0005.txt, test_0006.txt, test_0007.txt, test_0008.txt, test_0009.txt, test_0010.txt, test_0011.txt, test_0012.txt, test_0013.txt, test_0014.txt, test_0015.txt, test_0016.txt, test_0017.txt, test_0018.txt, test_0019.txt, test_0020.txt, test_0021.txt, test_0022.txt, test_0023.txt, test_0024.txt, test_0025.txt, test_0026.txt, test_0027.txt, test_0028.txt, test_0029.txt, test_0030.txt, test_0031.txt, test_0032.txt, test_0033.txt, test_0034.txt, test_0035.txt, test_0036.txt, test_0037.txt, test_0038.txt, test_0039.txt, test_0040.txt, test_0041.txt, test_0042.txt, test_0043.txt, test_0044.txt, test_0045.txt, test_0046.txt, test_0047.txt, test_0048.txt, test_0049.txt, test_0050.txt, test_0051.txt, test_0052.txt, test_0053.txt, test_0054.txt, test_0055.txt, test_0056.txt, test_0057.txt, test_0058.txt, test_0059.txt, test_0060.txt, test_0061.txt, test_0062.txt, test_0063.txt, test_0064.txt, test_0065.txt, test_0066.txt, test_0067.txt, test_0068.txt, test_0069.txt, test_0070.txt, test_0071.txt, test_0072.txt, test_0073.txt, test_0074.txt, test_0075.txt, test_0076.txt, test_0077.txt, test_0078.txt, test_0079.txt, test_0080.txt, test_0081.txt, test_0082.txt, test_0083.txt, test_0084.txt, test_0085.txt, test_0086.txt, test_0087.txt, test_0088.txt, test_0089.txt, test_0090.txt, test_0091.txt, test_0092.txt, test_0093.txt, test_0094.txt, test_0095.txt, test_0096.txt, test_0097.txt, test_0098.txt, test_0099.txt, test_0100.txt, test_0101.txt, test_0102.txt, test_0103.txt, test_0104.txt, test_0105.txt, test_0106.txt, test_0107.txt, test_0108.txt, test_0109.txt, test_0110.txt, test_0111.txt, test_0112.txt, test_0113.txt, test_0114.txt, test_0115.txt, test_0116.txt, test_0117.txt, test_0118.txt, test_0119.txt, test_0120.txt, test_0121.txt, test_0122.txt, test_0123.txt, test_0124.txt, test_0125.txt, test_0126.txt, test_0127.txt, test_0128.txt, test_0129.txt, test_0130.txt, test_0131.txt, test_0132.txt, test_0133.txt, test_0134.txt, test_0135.txt, test_0136.txt, test_0137.txt, test_0138.txt, test_0139.txt, test_0140.txt, test_0141.txt, test_0142.txt, test_0143.txt, test_0144.txt, test_0145.txt, test_0146.txt, test_0147.txt, test_0148.txt, test_0149.txt
Case Name Status Exec Time Memory
test_0000.txt AC 1744 ms 232836 KiB
test_0001.txt AC 1746 ms 264988 KiB
test_0002.txt AC 1745 ms 224084 KiB
test_0003.txt AC 1746 ms 229836 KiB
test_0004.txt AC 1749 ms 224936 KiB
test_0005.txt AC 1743 ms 232332 KiB
test_0006.txt AC 1745 ms 243456 KiB
test_0007.txt AC 1745 ms 229180 KiB
test_0008.txt AC 1748 ms 192900 KiB
test_0009.txt AC 1745 ms 241276 KiB
test_0010.txt AC 1749 ms 255976 KiB
test_0011.txt AC 1746 ms 205852 KiB
test_0012.txt AC 1747 ms 255348 KiB
test_0013.txt AC 1745 ms 212716 KiB
test_0014.txt AC 1744 ms 211944 KiB
test_0015.txt AC 1744 ms 236204 KiB
test_0016.txt AC 1744 ms 254456 KiB
test_0017.txt AC 1746 ms 237856 KiB
test_0018.txt AC 1744 ms 249452 KiB
test_0019.txt AC 1749 ms 249888 KiB
test_0020.txt AC 1743 ms 205920 KiB
test_0021.txt AC 1743 ms 209648 KiB
test_0022.txt AC 1745 ms 248228 KiB
test_0023.txt AC 1748 ms 264052 KiB
test_0024.txt AC 1744 ms 236972 KiB
test_0025.txt AC 1747 ms 214316 KiB
test_0026.txt AC 1746 ms 227088 KiB
test_0027.txt AC 1747 ms 251172 KiB
test_0028.txt AC 1745 ms 250436 KiB
test_0029.txt AC 1742 ms 195440 KiB
test_0030.txt AC 1746 ms 245232 KiB
test_0031.txt AC 1746 ms 236120 KiB
test_0032.txt AC 1744 ms 224160 KiB
test_0033.txt AC 1748 ms 235624 KiB
test_0034.txt AC 1747 ms 239312 KiB
test_0035.txt AC 1746 ms 204060 KiB
test_0036.txt AC 1744 ms 259460 KiB
test_0037.txt AC 1746 ms 223616 KiB
test_0038.txt AC 1746 ms 235204 KiB
test_0039.txt AC 1748 ms 235560 KiB
test_0040.txt AC 1746 ms 237024 KiB
test_0041.txt AC 1746 ms 217608 KiB
test_0042.txt AC 1747 ms 243400 KiB
test_0043.txt AC 1749 ms 257140 KiB
test_0044.txt AC 1748 ms 247184 KiB
test_0045.txt AC 1745 ms 228964 KiB
test_0046.txt AC 1742 ms 205016 KiB
test_0047.txt AC 1748 ms 242336 KiB
test_0048.txt AC 1752 ms 241036 KiB
test_0049.txt AC 1748 ms 245284 KiB
test_0050.txt AC 1746 ms 247408 KiB
test_0051.txt AC 1743 ms 211512 KiB
test_0052.txt AC 1742 ms 206356 KiB
test_0053.txt AC 1743 ms 231212 KiB
test_0054.txt AC 1745 ms 244836 KiB
test_0055.txt AC 1744 ms 256644 KiB
test_0056.txt AC 1745 ms 201048 KiB
test_0057.txt AC 1746 ms 228544 KiB
test_0058.txt AC 1745 ms 246992 KiB
test_0059.txt AC 1744 ms 216460 KiB
test_0060.txt AC 1746 ms 233248 KiB
test_0061.txt AC 1744 ms 230496 KiB
test_0062.txt AC 1750 ms 198788 KiB
test_0063.txt AC 1744 ms 227396 KiB
test_0064.txt AC 1744 ms 208804 KiB
test_0065.txt AC 1744 ms 225748 KiB
test_0066.txt AC 1743 ms 222112 KiB
test_0067.txt AC 1746 ms 230044 KiB
test_0068.txt AC 1745 ms 218112 KiB
test_0069.txt AC 1745 ms 254980 KiB
test_0070.txt AC 1741 ms 188404 KiB
test_0071.txt AC 1748 ms 225056 KiB
test_0072.txt AC 1751 ms 231264 KiB
test_0073.txt AC 1747 ms 200916 KiB
test_0074.txt AC 1746 ms 225312 KiB
test_0075.txt AC 1748 ms 215112 KiB
test_0076.txt AC 1741 ms 215572 KiB
test_0077.txt AC 1744 ms 254116 KiB
test_0078.txt AC 1746 ms 228088 KiB
test_0079.txt AC 1743 ms 233844 KiB
test_0080.txt AC 1742 ms 218660 KiB
test_0081.txt AC 1745 ms 236368 KiB
test_0082.txt AC 1746 ms 248800 KiB
test_0083.txt AC 1745 ms 219440 KiB
test_0084.txt AC 1744 ms 246760 KiB
test_0085.txt AC 1745 ms 220976 KiB
test_0086.txt AC 1746 ms 259392 KiB
test_0087.txt AC 1743 ms 218440 KiB
test_0088.txt AC 1743 ms 229984 KiB
test_0089.txt AC 1746 ms 222756 KiB
test_0090.txt AC 1745 ms 217236 KiB
test_0091.txt AC 1746 ms 230716 KiB
test_0092.txt AC 1745 ms 270172 KiB
test_0093.txt AC 1743 ms 215656 KiB
test_0094.txt AC 1746 ms 197908 KiB
test_0095.txt AC 1741 ms 208072 KiB
test_0096.txt AC 1748 ms 241592 KiB
test_0097.txt AC 1747 ms 236320 KiB
test_0098.txt AC 1747 ms 233892 KiB
test_0099.txt AC 1746 ms 253824 KiB
test_0100.txt AC 1745 ms 256508 KiB
test_0101.txt AC 1748 ms 270784 KiB
test_0102.txt AC 1749 ms 267956 KiB
test_0103.txt AC 1748 ms 265696 KiB
test_0104.txt AC 1749 ms 196540 KiB
test_0105.txt AC 1746 ms 219136 KiB
test_0106.txt AC 1747 ms 254812 KiB
test_0107.txt AC 1747 ms 255124 KiB
test_0108.txt AC 1744 ms 231128 KiB
test_0109.txt AC 1747 ms 237888 KiB
test_0110.txt AC 1745 ms 261356 KiB
test_0111.txt AC 1744 ms 191104 KiB
test_0112.txt AC 1745 ms 244908 KiB
test_0113.txt AC 1746 ms 223368 KiB
test_0114.txt AC 1743 ms 197496 KiB
test_0115.txt AC 1745 ms 257032 KiB
test_0116.txt AC 1745 ms 256104 KiB
test_0117.txt AC 1747 ms 248460 KiB
test_0118.txt AC 1744 ms 238796 KiB
test_0119.txt AC 1747 ms 224040 KiB
test_0120.txt AC 1747 ms 227040 KiB
test_0121.txt AC 1744 ms 233764 KiB
test_0122.txt AC 1745 ms 239656 KiB
test_0123.txt AC 1745 ms 248136 KiB
test_0124.txt AC 1747 ms 199180 KiB
test_0125.txt AC 1747 ms 238788 KiB
test_0126.txt AC 1742 ms 224748 KiB
test_0127.txt AC 1748 ms 234364 KiB
test_0128.txt AC 1745 ms 242012 KiB
test_0129.txt AC 1745 ms 224916 KiB
test_0130.txt AC 1743 ms 239228 KiB
test_0131.txt AC 1750 ms 250188 KiB
test_0132.txt AC 1746 ms 249000 KiB
test_0133.txt AC 1747 ms 248708 KiB
test_0134.txt AC 1748 ms 210884 KiB
test_0135.txt AC 1749 ms 239088 KiB
test_0136.txt AC 1751 ms 237360 KiB
test_0137.txt AC 1748 ms 219708 KiB
test_0138.txt AC 1748 ms 264180 KiB
test_0139.txt AC 1746 ms 241652 KiB
test_0140.txt AC 1745 ms 220324 KiB
test_0141.txt AC 1743 ms 232420 KiB
test_0142.txt AC 1746 ms 255572 KiB
test_0143.txt AC 1749 ms 213128 KiB
test_0144.txt AC 1745 ms 232216 KiB
test_0145.txt AC 1745 ms 239576 KiB
test_0146.txt AC 1748 ms 261032 KiB
test_0147.txt AC 1746 ms 235872 KiB
test_0148.txt AC 1743 ms 223676 KiB
test_0149.txt AC 1745 ms 248508 KiB