题目解析:
AC代码:
#include <iostream>
using namespace std;
#include<vector>
double Sover(vector<vector<int>>&ret,int w,int h){
vector<vector<double>> dp(w+1,vector<double>(h+1));
dp[1][1]=1.0;
for(int i=1;i<=w;i++){
for(int j=1;j<=h;j++){
//情况一 如果dp[i][j] i!=1 || j!=1
if(!(i==1 && j==1))
{
dp[i][j]=dp[i-1][j]*(j==h?1.0:0.5) + dp[i][j-1]*(i==w?1.0:0.5);//等于前两个概率之和 还要考虑是否是边界的问题 如果是i==w?1.0:0.5 j==h?1.0:0.5
}
//情况二
if(1==ret[i][j])//如果遇到蘑菇阵 那么就将dp[i][j]=0
{
dp[i][j]=0.0;
}
}
}
return dp[w][h];
}
int main() {
int m,n,k;
while(cin>>m>>n>>k){
vector<vector<int>>vec(m+1,vector<int>(n+1));
int x=0,y=0;
while(k--){
cin>>x>>y;
vec[x][y]=1.0;
}
printf("%.2f\n",Sover(vec,m,n));
}
return 0;
}
// 64 位输出请用 printf("%lld")
如果有错,多多指教!