1. 程式人生 > >【概率】【找規律】hdu6229 Wandering Robots

【概率】【找規律】hdu6229 Wandering Robots

scan 矩形 對角線 -a cst 效應 邊緣 rdquo ots

題意:一個機器人在正方形迷宮的左上角,迷宮裏有些格子有障礙物,每一步機器人會等概率地向能走的格子轉移(包含自身)。問你無限長的時間之後,機器人處於矩形對角線的右下方的概率。

無限長時間意味著,起點沒有了意義。只需統計右下方每個格子的貢獻之和比上所有格子的貢獻之和。

假設迷宮不是離散的,而是連續的,那麽概率就是右下方的面積比上正方形的總面積。

然而,因為迷宮是離散的,而且有壞點存在,也就意味著會有“邊緣效應”存在,邊緣處的貢獻會降低。假設最開始中間每個格子貢獻為5(有五個格子可以轉移到它),邊緣為4,角落為3。再扣去壞點的損失,直接用右下方之和比上所有之和就是答案了。

#include<cstdio>
#include<algorithm>
using namespace std;
int T,n,K;
int x[1005],y[1005];
typedef long long ll;
const int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
bool a[10005][10005];
int main(){
    scanf("%d",&T);
    for(int zu=1;zu<=T;++zu){
        scanf("%d%d",&n,&K);
        ll ans=(ll)(n-2)*(ll)(5*n+6)+12ll;
        ll ans2=(ans-5ll*(ll)n+4ll)/2ll+5ll*(ll)n-4ll;
        for(int i=1;i<=K;++i){
            scanf("%d%d",&x[i],&y[i]);
            a[x[i]][y[i]]=1;
        }
        for(int i=1;i<=K;++i){
            int cnt=0;
            for(int j=0;j<4;++j){
                int tx=x[i]+dx[j],ty=y[i]+dy[j];
                if(tx>=0 && tx<n && ty>=0 && ty<n){
                    ++cnt;
                    if(!a[tx][ty]){
                        --ans;
                        if(tx+ty>=n-1){
                            --ans2;
                        }
                    }
                }
            }
            ans-=(ll)(cnt+1);
            if(x[i]+y[i]>=n-1){
                ans2-=(ll)(cnt+1);
            }
        }
        printf("Case #%d: %lld/%lld\n",zu,ans2/__gcd(ans2,ans),ans/__gcd(ans2,ans));
        for(int i=1;i<=K;++i){
            a[x[i]][y[i]]=0;
        }
    }
    return 0;
}

【概率】【找規律】hdu6229 Wandering Robots