我在做CF20D时,遇到一个有趣的问题。
以下代码会WA24:
#include<bits/stdc++.h>
using namespace std;
#define N 1003
#define eps 1e-12
int T,n,m,x,y;
double gs[N][N];
double grass(int n){
for(int i=1;i<=n;++i){
if(i<n)gs[i][i+1]/=gs[i][i];
gs[i][n+1]/=gs[i][i];
gs[i][i]/=gs[i][i];
gs[i+1][i+1]-=gs[i][i+1]*gs[i+1][i];
gs[i+1][n+1]-=gs[i][n+1]*gs[i+1][i];
gs[i+1][i]-=gs[i][i]*gs[i+1][i];
}
for(int i=n-1;i>=1;--i)gs[i][n+1]-=gs[i][i+1]*gs[i+1][n+1];
}
int main(){
cin>>n>>m;
cin>>x>>y;
n-=x;
if(m==1){
printf("%.10f",n*2);
return 0;
}
while(n--){
for(int i=1;i<=m;++i){
if(i==1){
gs[i][i]=2;
gs[i][i+1]=-1;
gs[i][m+1]+=3;
}
else if(i==m){
gs[i][i]=2;
gs[i][i-1]=-1;
gs[i][m+1]+=3;
}
else{
gs[i][i]=3;
gs[i][i-1]=gs[i][i+1]=-1;
gs[i][m+1]+=4;
}
}
grass(m);
}
printf("%.10f",gs[y][m+1]);
}
而以下代码则会AC:
#include<bits/stdc++.h>
using namespace std;
#define N 1010
#define eps 1e-12
int T,n,m,x,y;
double gs[N][N];
void grass(int n){
for(int i=1;i<=n;++i){
if(i<n)gs[i][i+1]/=gs[i][i];
gs[i][n+1]/=gs[i][i];
gs[i][i]/=gs[i][i];
gs[i+1][i+1]-=gs[i][i+1]*gs[i+1][i];
gs[i+1][n+1]-=gs[i][n+1]*gs[i+1][i];
gs[i+1][i]-=gs[i][i]*gs[i+1][i];
}
for(int i=n-1;i>=1;--i)gs[i][n+1]-=gs[i][i+1]*gs[i+1][n+1];
}
int main(){
cin>>n>>m;
cin>>x>>y;
n-=x;
if(m==1){
cout<<fixed<<setprecision(10)<<2*n;
return 0;
}
while(n--){
for(int i=1;i<=m;++i){
if(i==1){
gs[i][i]=2;
gs[i][i+1]=-1;
gs[i][m+1]+=3;
}
else if(i==m){
gs[i][i]=2;
gs[i][i-1]=-1;
gs[i][m+1]+=3;
}
else{
gs[i][i]=3;
gs[i][i-1]=gs[i][i+1]=-1;
gs[i][m+1]+=4;
}
}
grass(m);
}
cout<<fixed<<setprecision(10)<<gs[y][m+1];
}
可以看到,这两份代码只有输出方式的差别。为什么会出现一个WA,一个AC的情况呢?
求大神解答,玄关。