Random Walk 高斯消元法

2022-05-01 23:33:20 字數 1659 閱讀 3008

有乙個 $n \times m$ 大小的格仔,從(0, 0)出發,每一步朝著上下左右4個格仔中可以移動的格仔等概率移動。另外有些格仔有石頭,因此無法移至這些格仔。求第一次到達 $(n-1, m-1)$ 格仔的期望步數。($2 \leq n,m\leq 10$)

設 $e(x, y)$ 表示從 (x, y) 出發到終點的期望步數。

我們先考慮從 $(x, y)$  向上下左右4個方向都可以移動的情況,由於向4個方向的移動的概率是相等的,因此可以建立如下關係:

$$\begin

e(x, y) & =  \frac(e(x-1, y)+1) + \frac(e(x+1,y)+1) + \frac(e(x, y-1)+1) + \frac(e(x, y+1)+1)\\

&=\frac(e(x-1, y) + e(x+1, y) + e(x, y-1) + e(x, y+1)) + 1\\

\end$$

如果移動不是等概率,只需要把 1/4 改成相應的數值就可以了。

如果存在不能移動的方向,我們也可以列出類似的式子。

為了使方程有唯一解,我們令有石頭的格仔和無法到達的格仔都有 $e(x, y) = 0$。

把得到的 $n \times m$ 個方程聯立,就可以解出期望步數。

#includeusing

namespace

std;

const

int maxn = 10+5

;const

int maxm = 10+5

;char grid[maxn][maxm+1

];int

n, m;

bool vis[maxn][maxm]; //

can[x][y]為true表示(x, y)能夠達到終點

const

int dx[4] = ;

const

int dy[4] = ;

//搜尋可以達到終點的點

void dfs(int x, inty)}

const

double eps = 1e-8

;typedef

double matrix[maxn*maxm][maxn*maxm];

//結果為a[i][n]/a[i][i]

void gauss_jordan(matrix a, intn)}

void debug_print(matrix a, int

n)matrix a;

intmain()

dfs(

0, 0

);

//構建矩陣

for(int i = 0;i < n;i++)

for(int j = 0;j < m;j++)

int move = 0

;

for(int k = 0;k <4;k++)

}a[i*m + j][i*m + j] = a[i*m + j][n*m] =move;

}//debug_print(a, n*m+1);

gauss_jordan(a, n*m);

printf(

"%.8f\n

", a[0][n*m] / a[0][0

]);

return0;

}

高斯消元法(二) 高斯消元法原理

高斯消去法是一種常用的求解線性方程組的方法,通過逐次消元後,在回代求解,實際計算中常用的一種方法。順序消去法 將ax b按照從上至下 從左至右的順序化為上三角方程組,中間過程不對矩陣進行交換,主要步驟如下。step1 將第2行至第n行,每行分別與第一行做運算,消掉每行第乙個引數。公式如 形成如下圖所...

高斯消元法

寒假前,小導師給我們布置了三道程式設計題,其中有一道是利用高斯消元法解線性方程組的。在網上搜了些資料,自己照葫蘆畫瓢編出乙個簡單的高斯消元法 利用矩陣的初等行變換 高斯消元法解線性方程組 include include include define dim 10 double a dim 1 dim...

高斯消元法

學過至少一元二次方程解法的同學們肯定知道,最常用的求根方法是加減消元法。所謂加減消元法,就是通過方程的等式性質,將某一未知數的係數同一化,再通過兩個等式的加減消去乙個元,從而將多元方程不斷降元,從而解出乙個未知數,不斷代回,從而求出所有根。此加減消元法就是高斯消元法。所以程式思路也盡可知。以下直接附...