dp[k][x][y]表示第k步的时候女孩走到x行、y列的概率;一步一步的递推就可以了。
需要注意的地方是算完第i步相遇的概率后需要将dp[i][(n+1)/2][i]清零才能算后面相遇的概率,若不清零会对求第i+1步相遇的概率产生影响,即——第i步相遇了,第i+1步还相遇,出现不应有的概率叠加。
#include <iostream> #include <cstdio> #include <string> #include <vector> #include <cstring> #include <utility> #include <algorithm> using namespace std; const int N = 105; const int px[] = {-1, 0, 0, 1}; const int py[] = {0, -1, 1, 0}; double dp[2][N][N]; int n; int main() { while(scanf("%d", &n) != EOF) { int pre = 0, nxt = 1; memset(dp, 0, sizeof(dp)); int p = (n+1) >> 1; dp[pre][p][p] = 1; double ans = 0.0; for(int k = 0; k < n; k++) { memset(dp[nxt], 0, sizeof(dp[nxt])); for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) { int ct = 4; for(int d = 0; d < 4; d++) { if(i+px[d]<1 || i+px[d]>n || j+py[d]<1 || j+py[d]>n) ct--; } for(int d = 0; d < 4; d++) { if(i+px[d]<1 || i+px[d]>n || j+py[d]<1 || j+py[d]>n) continue; else dp[nxt][i+px[d]][j+py[d]] += dp[pre][i][j]*1.0/ct; } } ans += dp[nxt][p][k+1]; dp[nxt][p][k+1] = 0; pre = nxt; nxt = pre ^ 1; } printf("%.4f\n", ans); } return 0; }