結果
問題 | No.5006 Hidden Maze |
ユーザー |
|
提出日時 | 2022-06-08 23:43:24 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 107 ms / 2,000 ms |
コード長 | 2,779 bytes |
コンパイル時間 | 2,755 ms |
実行使用メモリ | 22,876 KB |
スコア | 65,253 |
平均クエリ数 | 348.47 |
最終ジャッジ日時 | 2022-06-12 13:35:14 |
合計ジャッジ時間 | 12,152 ms |
ジャッジサーバーID (参考情報) |
judge13 / judge14 |
純コード判定しない問題か言語 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 100 |
ソースコード
#include<bits/stdc++.h>using namespace std;int h,w,p;int ask(string &s){cout << s << '\n';fflush(stdout);int res;cin >> res;return res;}string dch="UDLR";int dx4[4]={-1,1,0,0};int dy4[4]={0,0,-1,1};int cvrt[256];int getID(int fx,int fy,int d){if(d==0){fx--;}if(d==2){fy--;}if(d<=1){return fx*20+fy;}return (20*20)+fx*20+fy;}int fix[1024]={0};double prob[1024];double iniprob,hitwall;using pi=pair<int,int>;using pdi=pair<double,int>;using pdpdi=pair<double,pdi>;string dijkstra(){vector<double> rt1(512,0.0);rt1[0]=1.0;for(int i=0;i<h;i++){for(int j=0;j<w;j++){for(int k=1;k<4;k+=2){int ni=i+dx4[k];int nj=j+dy4[k];if(!(0<=ni && ni<h)){continue;}if(!(0<=nj && nj<w)){continue;}double raw=exp(-prob[getID(i,j,k)]+iniprob);rt1[ni*w+nj]+=rt1[i*w+j]*raw;}}}vector<double> rt2(512,0.0);rt2[(h-1)*w+(w-1)]=1.0;for(int i=h-1;i>=0;i--){for(int j=w-1;j>=0;j--){for(int k=0;k<4;k+=2){int ni=i+dx4[k];int nj=j+dy4[k];if(!(0<=ni && ni<h)){continue;}if(!(0<=nj && nj<w)){continue;}double raw=exp(-prob[getID(i,j,k)]+iniprob);rt2[ni*w+nj]+=rt2[i*w+j]*raw;}}}vector<double> d(512,1e9);vector<int> mem(512,0);priority_queue<pdpdi,vector<pdpdi>,greater<pdpdi>> pq;d[0]=0;mem[0]=-1;pq.push({0,{0,0}});while(!pq.empty()){pdpdi od=pq.top();pq.pop();if(d[od.second.second]>od.first){continue;}int x=od.second.second/w;int y=od.second.second%w;for(int i=0;i<4;i++){int nx=x+dx4[i];int ny=y+dy4[i];if(!(0<=nx && nx<h)){continue;}if(!(0<=ny && ny<w)){continue;}double cur=prob[getID(x,y,i)];int nv=nx*w+ny;double nfir=-(rt1[nx*w+ny]*rt2[nx*w+ny]);if(d[nv]>(od.first+cur)){d[nv]=(od.first+cur);mem[nv]=i;pq.push({d[nv],{nfir,nv}});}}}string res;int cx=h-1,cy=w-1;while(cx>0 || cy>0){int cd=mem[cx*w+cy];res.push_back(dch[cd]);cx-=dx4[cd];cy-=dy4[cd];}reverse(res.begin(),res.end());return res;}void feedback(string &path,int hands){int x=0,y=0;for(int i=0;i<=hands;i++){int d=cvrt[path[i]];int id=getID(x,y,d);if(i!=hands){fix[id]=1;}if(fix[id]){prob[id]=iniprob;}else{prob[id]+=hitwall;}x+=dx4[d];y+=dy4[d];}}int main(){for(int i=0;i<4;i++){cvrt[dch[i]]=i;}cin >> h >> w >> p;iniprob=-log(((double)(100-p))/100.0);hitwall=-log(((double)p)/100.0);for(int i=0;i<1024;i++){prob[i]=iniprob;}while(1){string cask=dijkstra();int cres=ask(cask);if(cres==-1){break;}feedback(cask,cres);}return 0;}