1. 程式人生 > >HDU 6229 - Wandering Robots - [概率題]

HDU 6229 - Wandering Robots - [概率題]

矩陣 自動機 題目 spa 叠代 first ac代碼 show art

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=6229

轉載:

https://blog.csdn.net/Anna__1997/article/details/78494788

題目大意

N * N的區域內,有K個格子不能到達,機器人從(0, 0)出發有均等的該概率留在原地和到達上下左右可到達的區域,問無窮遠的時間以後有多大概率到達 x + y >= n - 1 的區域。

思路

計算除了不能到達的格子之外的格子能通往多少方向d,則格子的權值為d + 1,

ans = x + y >= n - 1 的格子的權值之和 / 總權值和

*******************************************************
馬爾科夫鏈的隨機遊走模型
可建立狀態轉移矩陣,對n * n 的圖中n * n 個點編號為0 ~[ (n - 1) * n + n – 1] 設最大編號為max
P = p(i, j) =

[p(0, 0) p(0, 1) … p(0, max)
P(1, 0) p(1, 1) … p(1, max)

P(max, 0) p(max, 1) … p(max, max)]
π(i) 為 i 時間各點的概率
π(n + 1) = π(n) * P
當時間 ->無窮 π(n + 1)->π
可以通過 π * P = π 計算
驗證猜測結果正確
*******************************************************
找規律的答案 有待證明
現在能想到的是 整個封閉系統每個格子以出現機器人的概率作為權值 在很長的時間線上是一個熵增的
過程(想到元胞自動機),如果要模擬這個概率擴散的過程的話,格子的權值的更新是一個用他所能到達的格子的權值
和他自身的權值叠代的過程,這個過程中可以發現他的相鄰的格子的權值是在不斷同化的,因此,在無窮遠後
(0, 0)的和他周圍的格子的權值不在體現優勢,而更加開放的格子則更占優(可根據叠代公式理解)

AC代碼:

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;

const int maxn=10000+10;
const int maxk=1000+10;
const int dx[4]={0,1,0,-1};
const int dy[4]={1,0,-1,0};

int n,k;
map<pii,bool> mp;
int p,q;

inline int gcd(int m,int n){return n?gcd(n,m%n):m;}
inline int check(const
int &x,const int &y) { if(x<0||x>=n||y<0||y>=n) return 0; if((x==0||x==n-1) && (y==0||y==n-1)) return 3; else if((x==0||x==n-1) && (y!=0&&y!=n-1)) return 4; else if((y==0||y==n-1) && (x!=0&&x!=n-1)) return 4; else return 5; } int main() { int T; cin>>T; for(int kase=1;kase<=T;kase++) { mp.clear(); scanf("%d%d",&n,&k); for(int i=1,x,y;i<=k;i++) { scanf("%d%d",&x,&y); mp[make_pair(x,y)]=1; } p=3*3+2*(n-2)*4+(n-2)*(n-1)/2*5; q=4*3+4*(n-2)*4+(n-2)*(n-2)*5; for(map<pii,bool>::iterator it=mp.begin();it!=mp.end();it++) { int x=((*it).first).first; int y=((*it).first).second; if(x+y>=n-1) p-=check(x,y); q-=check(x,y); for(int i=0;i<4;i++) { int nxtx=x+dx[i]; int nxty=y+dy[i]; if(check(nxtx,nxty)>0 && mp.count(make_pair(nxtx,nxty))==0) { if(nxtx+nxty>=n-1) p--; q--; } } } int g=gcd(p,q); printf("Case #%d: %d/%d\n",kase,p/g,q/g); } }

HDU 6229 - Wandering Robots - [概率題]