1020:Cleaning Robot
問題文
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1020&lang=jp
確率DP。
dp[使ったバッテリーの量][Y座標][X座標]:=確率
dp[k+1][y+dy[ i ] ][x+dx[ i ] ]+=dp[k][y][x]/4
もしその方向に動けない場合は
dp[k+1][y][x]+=dp[k][y][x]/4
#include<iostream> #include<vector> #include<algorithm> #include<map> #include<cstdio> #define X first #define Y second using namespace std; typedef pair<int,int> P; int dx[4]={0,0,1,-1}; int dy[4]={1,-1,0,0}; string idx="ABCDEFGHI"; int main(void){ map<char,P> mp; int cnt=0,b; for(int i=0;i<3;i++) for(int j=0;j<3;j++)mp[idx[cnt++]]=P(i,j); P s,t,d; char S,T,D; while(cin >> b >> S >> T >> D){ s.X=mp[S].X,s.Y=mp[S].Y; t.X=mp[T].X,t.Y=mp[T].Y; d.X=mp[D].X,d.Y=mp[D].Y; double dp[16][3][3]; for(int i=0;i<16;i++) for(int j=0;j<3;j++) for(int k=0;k<3;k++)dp[i][j][k]=0; dp[0][s.Y][s.X]=1; for(int k=0;k<b;k++){ for(int x=0;x<3;x++){ for(int y=0;y<3;y++){ for(int i=0;i<4;i++){ int nx=x+dx[i],ny=y+dy[i]; if(nx<0 || ny<0 || 2<nx || 2<ny || (nx==d.X && ny==d.Y))nx=x,ny=y; dp[k+1][ny][nx]+=dp[k][y][x]/4; } } } } printf("%.8f\n",dp[b][t.Y][t.X]); } return 0; }