Broken robot
题目链接:https://codeforces.ml/problemset/problem/24/D
题意:有个n行m列的牢房,你现在在第x行,y列。每次你都有相同的概率呆在原地,向左走一格(x>1),向右走一格(x<m),向下走一格。问你走到第n行的期望步数。
思路:首先肯定是要逆推的,但由于可以在一行反复走,所以并不好弄。但可以考虑到在一行反复横跳 100 次的概率是极小的,所以可以直接暴力让他横跳100次。
#include<bits/stdc++.h> #include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; typedef long long ll; int a[1010]; double b[1010],c[1010]; int main() { int n,m,x,y; cin>>n>>m>>x>>y; if(n==x) { cout<<"0"<<endl; return 0; } for(int i=1;i<=m;i++) { if(i==1&&i==m) a[i]=2; else if(i==1||i==m) a[i]=3; else a[i]=4; } n-=x; for(int i=1;i<=n;i++) { memset(b,0,sizeof(b)); for(int j=1;j<=100;j++) { for(int k=1;k<=m;k++) b[k]=(b[k]+b[k-1]+b[k+1]+c[k])/a[k]+1; } swap(b,c); } printf("%.9lf\n",c[y]); }