高斯消元弄了半天没弄对。。
#include<bits/stdc++.h> using namespace std; #define maxn 205 #define eps 1e-8 double A[maxn][maxn],x[maxn],ans[maxn]; int nxt[maxn],n; #define a A void guess(int n){ //行,列 for(int i=1;i<n;i++){ if(a[i][i]==0){//求主元的时候不能直接用swap进行交换 int id=0; for(int j=i+1;j<=n;j++) if(a[j][i]!=0) id=j; for(int j=i;j<=n+1;j++) swap(a[i][j],a[id][j]); } for(int j=i+1;j<=n;j++){//消下三角 double t=a[j][i]/a[i][i]; for(int k=i;k<=n+1;k++) a[j][k]-=(a[i][k]*t); } } for(int i=n;i>=1;i--) { for(int j=i+1;j<=n;j++) a[i][n+1]-=ans[j]*a[i][j]; ans[i]=a[i][n+1]/a[i][i]; } } int main(){ int t;cin>>t; for(int tt=1;tt<=t;tt++){ int n;cin>>n; memset(nxt,0,sizeof nxt); memset(A,0,sizeof A); for(int i=0;i<n;i++){int x,y;cin>>x>>y;nxt[x]=y;} for(int i=1;i<100;i++){//建立矩阵 if(nxt[i]){ A[i][i]=1; A[i][101]=0; A[i][nxt[i]]=-1; } else { int k=0; for(int j=1;i+j<=100 && j<=6;j++){ k++; A[i][i+j]=-1; } A[i][i]=k,A[i][101]=6; } } A[100][100]=1;A[100][101]=0; guess(100); printf("Case %d: %.10lf ",tt,ans[1]); } return 0; }