
昨日の続きです。100ステップを目標にしてみました。
みんなにはないしょだよ!
import sys import copy #配列などのコピー用 import time import itertools #順列など作成でたまーに使う def get(til,x,y): if 0>x or 0>y or x>6 or y>6:return 0 return til[x+y*7] def walk3(til,p,tr): _,x,y,_=p[0] sp,pp=[(x,y,"MOVE",0,0)],[(x,y)] bTpoint,bWalk=0,"PASS" while len(sp)>0: for h in range(4): sx,sy,sm,mv,tp=sp[0] if mv>19:continue #20歩は歩かない tx,ty=sx+dx[h],sy+dy[h] #移動先の座標 if (tx,ty) in pp:continue #同じところを歩かない if ( (get(til,sx,sy) & [8,4,2,1][h]) >0) and ( (get(til,sx+dx[h],sy+dy[h]) & [8,4,2,1][[2,3,0,1][h]])>0): #移動できるか判断 sm+=dm[h] #移動情報を追加 if (tx,ty) in tr:tp+=1 #宝をとったら if tp>bTpoint:bTpoint,bWalk=tp,sm sp+=[(tx,ty,sm,mv+1,tp)] pp+=[(tx,ty)] del sp[0] return bWalk,bTpoint def slideMe(p,c,l,mdx,mdy): rp=copy.deepcopy(p) c,x,y,t=rp[0] if l==y:x=[6,0,1,2,3,4,5,6,0][x+mdx+1] #端っこループ if c==x:y=[6,0,1,2,3,4,5,6,0][y+mdy+1] rp[0]=c,x,y,t return rp def slideTreasure(tr,c,l,mdx,mdy): rtr=copy.deepcopy(tr) for i in range(len(rtr)): x,y=tr[i] if l==y:x=[6,0,1,2,3,4,5,6,0][x+mdx+1] if c==x:y=[6,0,1,2,3,4,5,6,0][y+mdy+1] rtr[i]=x,y return rtr def slideRight(til,line,p,newTile,tr): for i in range(line*7+1,line*7+7):til[i]=tile[i-1] #スライドさせて til[line*7]=newTile #スライド開始箇所におく return til,slideMe(p,-1,line,1,0),slideTreasure(tr,-1,line,1,0) def slideLeft(til,line,p,newTile,tr): for i in range(line*7,line*7+6):til[i]=tile[i+1] til[line*7+6]=newTile return til,slideMe(p,-1,line,-1,0),slideTreasure(tr,-1,line,-1,0) def slideDown(til,line,p,newTile,tr): for i in range(6):til[i*7+7+line]=tile[i*7+line] til[line]=newTile return til,slideMe(p,line,-1,0,1),slideTreasure(tr,line,-1,0,1) def slideUp(til,line,p,newTile,tr): for i in range(6):til[i*7+line]=tile[i*7+7+line] til[42+line]=newTile return til,slideMe(p,line,-1,0,-1),slideTreasure(tr,line,-1,0,-1) def questItem(tr,q,pNum): #宝の中からクエスト(ポイント対象)になっているものを返す rtr=[] for i in tr: x,y,name,pid=i if pid==pNum and ((name,pid) in q):rtr+=[(x,y)] return rtr dx,dy,dm,dfunc=[0,1,0,-1],[-1,0,1,0],[" UP"," RIGHT"," DOWN"," LEFT"],[slideUp,slideRight,slideDown,slideLeft] #dfunk 方向によって呼び出す関数を変更 tm=[] loop47=itertools.product(range(4), range(7)) #方向4方向 各押す場所7ヶ所 2重ループのはずすため(使わないほうがいいかも) while True: starttime = time.time() turn_type = int(input()) tile,p,tr,q=[],[],[],[] #タイル情報、プレイヤー情報、宝情報、クエスト情報 for i in range(7):tile+=[int(t,2) for t in input().split()] #tileデータを2進数とみなして10進数化 for i in range(2):p+=[([int(i) for i in input().split()])] #num_player_cards, player_x, player_y, player_tile for i in range(int(input())):#num_items item_name, item_x, item_y, item_player_id = input().split() tr+=[(int(item_x),int(item_y),item_name,int(item_player_id))] for i in range(int(input())):#num_quests quest_item_name, quest_player_id = input().split() q+=[(quest_item_name,int(quest_player_id))] tr=questItem(tr,q,0) if turn_type==0: _,x,_,nt=p[0] nt=int(str(nt),2) #自分の持っているタイル bst,bm=0,"PUSH "+str(x)+" UP" #困った時は気持ち上がってみる for h, i in loop47: til,rp,rtr=dfunc[h](copy.deepcopy(tile),i,p,nt,tr) #タイルを動かして _,st=walk3(til,rp,rtr) #リンクがいくつ宝を手にできるか if bst<st:bst,bm=st,"PUSH "+str(i)+dm[h] print(bm) else:print((walk3(tile,p,tr))[0]) #帰ってきた値をタプルにしてその中の移動コマンドを実行(表示) tm+=[(time.time()-starttime)] #時間計測 print(int(sum(tm)*1000/len(tm)), file=sys.stderr) print(int(tm[-1]*1000), file=sys.stderr) #時間表示ms(1000倍しないと0になる)