Submission #76873791


Source Code Expand

import sys
import time
import random
from collections import deque
def openedDoor(doortype,mask):
  if doortype==-1:
    return True
  sid=doortype//2
  state=(mask>>sid) & 1
  if state==(doortype%2):
    return True
  else:
    return False
def calc_score_dist(n,k,grid,vert_doors,hori_doors,swit):
  total_states=1<<k
  dist=[[[-1]*n for _ in range(n)] for _ in range(total_states)]
  queue=deque()
  queue.append((0,0,0))
  dist[0][0][0]=0
  dirn=[[-1,0],[1,0],[0,-1],[0,1]]
  while queue:
    mask,row,col=queue.popleft()
    curr=dist[mask][row][col]
    if row==n-1 and col==n-1:
      return curr
    for r,c in dirn:
      new_r=row+r
      new_c=col+c
      if not (0<=new_r<n and 0<=new_c<n):
        continue
      if grid[new_r][new_c]=='#':
        continue
      doortype=-1
      if r==1:
        doortype=vert_doors[row][col]
      elif r==-1:
        doortype=vert_doors[new_r][new_c]
      elif c==1:
        doortype=hori_doors[row][col]
      else:
        doortype=hori_doors[new_r][new_c]
      if not openedDoor(doortype,mask):
        continue
      if dist[mask][new_r][new_c]==-1:
        dist[mask][new_r][new_c]=curr+1
        queue.append((mask,new_r,new_c))
    swittype=swit[row][col]
    if swittype!=-1:
      next_mask=mask^(1<<swittype)
      if dist[next_mask][row][col]==-1:
        dist[next_mask][row][col]=curr+1
        queue.append((next_mask,row,col))
  return 0
  
def solve():
  start_time=time.time()
  limit=1.85
  data=sys.stdin.read().split()
  if not data:
    return
  n=int(data[0])
  max_doors=int(data[1])
  k=int(data[2])
  grid=data[3:3+n]
  empty_cells=[]
  for i in range(n):
    for j in range(n):
      if grid[i][j]=='.':
        empty_cells.append([i,j])
  vert_doors=[[-1]*n for i in range(n)]
  hori_doors=[[-1]*n for i in range(n)]
  swit=[[-1]*n for i in range(n)]
  placed_doors=[]
  placed_swit=[]
  cand_pos=[]
  for i,j in empty_cells:
    if [i,j]==[0,0]:
      continue
    if [i,j]==[n-1,n-1]:
      continue
    cand_pos.append([i,j])
  random.shuffle(cand_pos)
  for sid in range(k):
    if sid>=len(cand_pos):
      break
    i,j=cand_pos[sid]
    swit[i][j]=sid
    placed_swit.append([i,j,sid])
  currtype=0
  for i in range(n-1):
    for j in range(n):
      if len(placed_doors)>=max_doors//2:
        break
      if grid[i][j]!='.':
        continue
      if grid[i+1][j]!='.':
        continue
      vert_doors[i][j]=currtype
      placed_doors.append([0,i,j,currtype])
      currtype=(currtype+1)%(2*k)
  best_dist=calc_score_dist(n,k,grid,vert_doors,hori_doors,swit)
  while True:
    elapsed=time.time()-start_time
    if elapsed>limit:
      break
    if placed_swit and random.random()<0.30:
      move_switch=True
    else:
      move_switch=False
    if move_switch:
      switch_index=random.randrange(len(placed_swit))
      old_r,old_c,swit_type=placed_swit[switch_index]
      new_r,new_c=random.choice(cand_pos)
      if swit[new_r][new_c]!=-1:
        continue
      swit[old_r][old_c]=-1
      swit[new_r][new_c]=swit_type
      cand_score=calc_score_dist(n,k,grid,vert_doors,hori_doors,swit)
      if cand_score>best_dist:
        best_dist=cand_score
        placed_swit[switch_index]=[new_r,new_c,swit_type]
      else:
        swit[new_r][new_c]=-1
        swit[old_r][old_c]=swit_type
    elif placed_doors:
      door_index=random.randrange(len(placed_doors))
      dirn,row,col,old_type=placed_doors[door_index]
      new_type=random.randint(0,2*k-1)
      if dirn==0:
        vert_doors[row][col]=new_type
      else:
        hori_doors[row][col]=new_type
      cand_score=calc_score_dist(n,k,grid,vert_doors,hori_doors,swit)
      if cand_score>best_dist:
        best_dist=cand_score
        placed_doors[door_index]=[dirn,row,col,new_type]
      else:
        if dirn==0:
          vert_doors[row][col]=old_type
        else:
          hori_doors[row][col]=old_type
  print(len(placed_doors))
  for dirn,row,col,door_type in placed_doors:
    print(dirn,row,col,door_type)
  print(len(placed_swit))
  for row,col,stype in placed_swit:
    print(row,col,stype)
solve()
  










Submission Info

Submission Time
Task A - Castle Renovation with Linked Doors
User MadhavRamSai3
Language Python (PyPy 3.11-v7.3.20)
Score 132426541
Code Size 4247 Byte
Status AC
Exec Time 1995 ms
Memory 571228 KiB

Judge Result

Set Name test_ALL
Score / Max Score 132426541 / 3000000000
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 1949 ms 565036 KiB
test_0001.txt AC 1995 ms 570384 KiB
test_0002.txt AC 1950 ms 566568 KiB
test_0003.txt AC 1949 ms 567756 KiB
test_0004.txt AC 1950 ms 568260 KiB
test_0005.txt AC 1951 ms 563836 KiB
test_0006.txt AC 1952 ms 568980 KiB
test_0007.txt AC 1950 ms 565588 KiB
test_0008.txt AC 1952 ms 569692 KiB
test_0009.txt AC 1951 ms 566464 KiB
test_0010.txt AC 1950 ms 563044 KiB
test_0011.txt AC 1950 ms 570024 KiB
test_0012.txt AC 1951 ms 569924 KiB
test_0013.txt AC 1951 ms 565644 KiB
test_0014.txt AC 1950 ms 564340 KiB
test_0015.txt AC 1949 ms 567500 KiB
test_0016.txt AC 1950 ms 564372 KiB
test_0017.txt AC 1950 ms 570672 KiB
test_0018.txt AC 1950 ms 568540 KiB
test_0019.txt AC 1948 ms 565716 KiB
test_0020.txt AC 1948 ms 562800 KiB
test_0021.txt AC 1948 ms 566400 KiB
test_0022.txt AC 1949 ms 567372 KiB
test_0023.txt AC 1949 ms 566244 KiB
test_0024.txt AC 1948 ms 567940 KiB
test_0025.txt AC 1949 ms 565120 KiB
test_0026.txt AC 1949 ms 567940 KiB
test_0027.txt AC 1948 ms 564196 KiB
test_0028.txt AC 1947 ms 565756 KiB
test_0029.txt AC 1948 ms 567624 KiB
test_0030.txt AC 1950 ms 567576 KiB
test_0031.txt AC 1947 ms 566276 KiB
test_0032.txt AC 1948 ms 566432 KiB
test_0033.txt AC 1947 ms 570124 KiB
test_0034.txt AC 1948 ms 567880 KiB
test_0035.txt AC 1948 ms 563696 KiB
test_0036.txt AC 1948 ms 567876 KiB
test_0037.txt AC 1949 ms 567464 KiB
test_0038.txt AC 1949 ms 565544 KiB
test_0039.txt AC 1951 ms 567248 KiB
test_0040.txt AC 1948 ms 563860 KiB
test_0041.txt AC 1949 ms 567068 KiB
test_0042.txt AC 1949 ms 567860 KiB
test_0043.txt AC 1948 ms 563592 KiB
test_0044.txt AC 1949 ms 567164 KiB
test_0045.txt AC 1949 ms 568412 KiB
test_0046.txt AC 1948 ms 566324 KiB
test_0047.txt AC 1947 ms 564900 KiB
test_0048.txt AC 1948 ms 567312 KiB
test_0049.txt AC 1947 ms 567264 KiB
test_0050.txt AC 1956 ms 567976 KiB
test_0051.txt AC 1949 ms 569308 KiB
test_0052.txt AC 1950 ms 562944 KiB
test_0053.txt AC 1950 ms 570848 KiB
test_0054.txt AC 1984 ms 565956 KiB
test_0055.txt AC 1950 ms 563912 KiB
test_0056.txt AC 1951 ms 570028 KiB
test_0057.txt AC 1950 ms 569340 KiB
test_0058.txt AC 1950 ms 565772 KiB
test_0059.txt AC 1949 ms 568864 KiB
test_0060.txt AC 1948 ms 569108 KiB
test_0061.txt AC 1956 ms 564568 KiB
test_0062.txt AC 1948 ms 564212 KiB
test_0063.txt AC 1948 ms 566420 KiB
test_0064.txt AC 1949 ms 564844 KiB
test_0065.txt AC 1949 ms 561872 KiB
test_0066.txt AC 1951 ms 568024 KiB
test_0067.txt AC 1948 ms 564168 KiB
test_0068.txt AC 1948 ms 568580 KiB
test_0069.txt AC 1949 ms 570096 KiB
test_0070.txt AC 1949 ms 567480 KiB
test_0071.txt AC 1951 ms 566620 KiB
test_0072.txt AC 1949 ms 566676 KiB
test_0073.txt AC 1949 ms 569056 KiB
test_0074.txt AC 1950 ms 567140 KiB
test_0075.txt AC 1948 ms 568104 KiB
test_0076.txt AC 1949 ms 566012 KiB
test_0077.txt AC 1950 ms 564944 KiB
test_0078.txt AC 1949 ms 565976 KiB
test_0079.txt AC 1949 ms 565264 KiB
test_0080.txt AC 1951 ms 561920 KiB
test_0081.txt AC 1950 ms 566696 KiB
test_0082.txt AC 1951 ms 566660 KiB
test_0083.txt AC 1951 ms 566260 KiB
test_0084.txt AC 1950 ms 565236 KiB
test_0085.txt AC 1951 ms 566436 KiB
test_0086.txt AC 1950 ms 569712 KiB
test_0087.txt AC 1951 ms 564944 KiB
test_0088.txt AC 1950 ms 565512 KiB
test_0089.txt AC 1950 ms 565516 KiB
test_0090.txt AC 1952 ms 568420 KiB
test_0091.txt AC 1949 ms 565248 KiB
test_0092.txt AC 1951 ms 564344 KiB
test_0093.txt AC 1950 ms 561708 KiB
test_0094.txt AC 1950 ms 562640 KiB
test_0095.txt AC 1951 ms 566068 KiB
test_0096.txt AC 1952 ms 565516 KiB
test_0097.txt AC 1949 ms 562096 KiB
test_0098.txt AC 1950 ms 568220 KiB
test_0099.txt AC 1952 ms 565716 KiB
test_0100.txt AC 1952 ms 568964 KiB
test_0101.txt AC 1950 ms 564780 KiB
test_0102.txt AC 1950 ms 565052 KiB
test_0103.txt AC 1950 ms 564624 KiB
test_0104.txt AC 1950 ms 563224 KiB
test_0105.txt AC 1951 ms 567444 KiB
test_0106.txt AC 1950 ms 571228 KiB
test_0107.txt AC 1952 ms 567740 KiB
test_0108.txt AC 1958 ms 567136 KiB
test_0109.txt AC 1952 ms 565888 KiB
test_0110.txt AC 1951 ms 564420 KiB
test_0111.txt AC 1951 ms 564248 KiB
test_0112.txt AC 1951 ms 564760 KiB
test_0113.txt AC 1953 ms 567696 KiB
test_0114.txt AC 1951 ms 565912 KiB
test_0115.txt AC 1951 ms 566668 KiB
test_0116.txt AC 1951 ms 561324 KiB
test_0117.txt AC 1952 ms 567028 KiB
test_0118.txt AC 1952 ms 564916 KiB
test_0119.txt AC 1950 ms 565896 KiB
test_0120.txt AC 1951 ms 567192 KiB
test_0121.txt AC 1951 ms 565520 KiB
test_0122.txt AC 1951 ms 566820 KiB
test_0123.txt AC 1953 ms 566968 KiB
test_0124.txt AC 1951 ms 563336 KiB
test_0125.txt AC 1959 ms 564452 KiB
test_0126.txt AC 1951 ms 565876 KiB
test_0127.txt AC 1951 ms 566948 KiB
test_0128.txt AC 1952 ms 565520 KiB
test_0129.txt AC 1950 ms 568132 KiB
test_0130.txt AC 1951 ms 567324 KiB
test_0131.txt AC 1951 ms 561216 KiB
test_0132.txt AC 1953 ms 568160 KiB
test_0133.txt AC 1951 ms 559716 KiB
test_0134.txt AC 1951 ms 566440 KiB
test_0135.txt AC 1951 ms 568340 KiB
test_0136.txt AC 1953 ms 568904 KiB
test_0137.txt AC 1952 ms 562320 KiB
test_0138.txt AC 1952 ms 564236 KiB
test_0139.txt AC 1951 ms 566184 KiB
test_0140.txt AC 1951 ms 567956 KiB
test_0141.txt AC 1951 ms 568968 KiB
test_0142.txt AC 1951 ms 567300 KiB
test_0143.txt AC 1952 ms 569656 KiB
test_0144.txt AC 1952 ms 565980 KiB
test_0145.txt AC 1952 ms 562008 KiB
test_0146.txt AC 1952 ms 567420 KiB
test_0147.txt AC 1951 ms 569592 KiB
test_0148.txt AC 1951 ms 564036 KiB
test_0149.txt AC 1951 ms 566668 KiB