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
",c[y]);
}
原文地址:https://www.cnblogs.com/zcb123456789/p/13741947.html