Broken robot

Broken robot

关键

期望用倒退,采用高斯消元求解

代码

#include <bits/stdc++.h>
using namespace std;
const int M=1005;

double a[M][M],f[M];
int n,m;
void solve(int x) {//哪一行
    for(int i=1;i<=m;i++) {//列出了m个方程组
        if(i==1) {
            a[i][i]=2;
            a[i][i+1]=-1;
            a[i][m+1]=3+f[i];
        }
        else if(i==m) {
            a[i][i]=2;
            a[i][i-1]=-1;
            a[i][m+1]=3+f[i];
        }
        else {
            a[i][i]=3;
            a[i][i+1]=-1;
            a[i][i-1]=-1;
            a[i][m+1]=4+f[i];
        }
    }
    for(int i=1;i<m;i++) {//这里需要变化就只有相邻的几项而已,所以可以o1进行消元
        double p=a[i+1][i]/a[i][i];
        a[i+1][i]=0;
        a[i+1][i+1]-=a[i][i+1]*p;
        a[i+1][m+1]-=a[i][m+1]*p;
    }
    f[m]=a[m][m+1]/a[m][m];
    for(int i=m-1;i>=1;i--)
        f[i]=(a[i][m+1]-f[i+1]*a[i][i+1])/a[i][i];
}

int main() {
    cin>>n>>m;
    int sx,sy;
    cin>>sx>>sy;
    if(m==1) printf("%.10lf\n",2.0*(n-sx));
    else {
        for(int i=n-1;i>=sx;i--)solve(i);
        printf("%.10lf\n",f[sy]);
    }
    return 0;
}
posted @ 2023-01-10 12:22  basicecho  阅读(23)  评论(0)    收藏  举报