p2271_dp.cpp

来自「高手写的所有acm例程 在acm.zju.edu.cn 上的题目的例程」· C++ 代码 · 共 53 行

CPP
53
字号
#include <stdio.h>
#include <string.h>

const    int       dx [4] = { 0 , 0 , -1 , 1 };
const    int       dy [4] = { -1 , 1 , 0 , 0 };

int      N , Face [100] [100];
bool     Ran [100] [100];
double   Opt [101] [100] [100] , Answer [100];

bool     range ( int x , int y )
{
         return x >= 0 && x < N && y >= 0 && y < N;
}

double   Ans ()
{
         if ( Answer [N - 1] >= 0 ) return Answer [N - 1];
         memset ( Face , 0 , sizeof ( Face ));
         for ( int i = 0; i < N; i ++ )
             for ( int j = 0; j < N; j ++ )
                 for ( int k = Face [i] [j] = 0; k < 4; k ++ )
                     if ( range ( i + dx [k] , j + dy [k] )) Face [i] [j] ++;
         
         double    Ret = 0;
         memset ( Opt [0] , 0 , sizeof ( Opt [0] ));
         Opt [0] [N / 2] [N / 2] = 1;
         int k  , i , j , t , x , y;
         
         for ( k = 0; k < N; k ++ ) {
             for ( i = 0; i < N; i ++ )
                 for ( j = 0; j < N; j ++ ) {
                     Opt [k + 1] [i] [j] = 0;
                     for ( t = 0; t < 4; t ++ ) {
                         x = i + dx [t] , y = j + dy [t];
                         if ( x >= 0 && x < N && y >= 0 && y < N )
                            Opt [k + 1] [i] [j] += Opt [k] [x] [y] / Face [x] [y];
                     }
                 }
             Ret += Opt [k + 1] [N / 2] [k];
             Opt [k + 1] [N / 2] [k] = 0;
         }
         Answer [N - 1] = Ret;
         return  Ret;
}

main ()
{
     for ( int i = 0; i < 100; i ++ ) Answer [i] = -1;
     while ( scanf ( "%d" , &N ) != EOF )
           printf ( "%.4lf\n" , Ans ());
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?