洛谷_P1002 [NOIP2002 普及组] 过河卒_dp

洛谷_P1002 [NOIP2002 普及组] 过河卒_dp

// 正解 
#include<bits/stdc++.h>
using namespace std;

typedef long long LL;
const int N=22;
bool mp[N][N];
LL dp[N][N];
int dx[]={ 0,1,1,-1,-1,2,2,-2,-2 };
int dy[]={ 0,2,-2,2,-2,1,-1,1,-1 };
int n,m,a,b;

void init()
{
    memset( mp,true,sizeof( mp ) );
    int i,j,tx,ty;
    for( i=0;i<9;i++ )
    {
        tx=a+dx[i]; ty=b+dy[i];
        if( tx>=0 && tx<=n && ty>=0 && ty<=m ) mp[tx][ty]=false;
    }
    memset( dp,0,sizeof( dp ) );
    for( i=0;i<=n;i++ )
        if( mp[i][0] ) dp[i][0]=1;
        else break;						//
    for( j=0;j<=m;j++ ) 
        if( mp[0][j] ) dp[0][j]=1;
        else break;						//
}

int main()
{
    int i,j;
    while( cin>>n>>m>>a>>b )
    {
        init();
        for( i=1;i<=n;i++ )
            for( j=1;j<=m;j++ )
            	if( mp[i][j] )			//
                	dp[i][j]=dp[i-1][j]+dp[i][j-1];
        cout<<dp[n][m]<<endl;
    }
    return 0;
}

//
预估规模

// 无障碍最大值 
#include<bits/stdc++.h>
using namespace std;

typedef long long LL;
const int N=21;
LL dp[N][N];

int main()
{
    int i,j;
    memset( dp,0,sizeof( dp ) );
    dp[1][1]=1;

    for( i=1;i<N;i++ )
        for( j=1;j<N;j++ )
        	if( i!=1 || j!=1 )
        		dp[i][j]=dp[i-1][j]+dp[i][j-1];
    cout<<dp[20][20]<<endl;
    
    return 0;
}
// 35345263800

// C( 40,20 ) 
#include<bits/stdc++.h>
using namespace std;

typedef long long LL;

LL C( LL n,LL m )
{
    if( n<m ) return 0;
    if( n==m || m==0 ) return 1;

    LL ans,i; n=n-m+1;
    for( ans=i=1;i<=m;i++ )
    {
        ans*=n++; ans/=i;
    }
    return ans;
}
 
int main()
{
    cout<<C( 40,20 )<<endl;
    return 0;
}
// 137846528820

// dfs_TLE
#include<bits/stdc++.h>
using namespace std;

const int N=33;
bool used[N][N];
int dx[]={ 0,1 };
int dy[]={ 1,0 };
int dxx[]={ 0,1,1,-1,-1,2,2,-2,-2 };
int dyy[]={ 0,2,-2,2,-2,1,-1,1,-1 };
int n,m,a,b;
long long ans;

bool is_error( int x,int y )
{													// 特别地,x==n && y==m 
    if( x<0 || x>n || y<0 || y>m ) return true; 	// 边界
    
    for( int i=0;i<9;i++ )
        if( x==a+dxx[i] && y==b+dyy[i] )    		// 马的控制点
            return true;
    return false;
}

void dfs( int x,int y )
{
    if( is_error( x,y ) ) return ;                  // 剪枝
    if( x==n && y==m ) { ans++; return ; }          // 所求

    int i,tx,ty;
    for( i=0;i<2;i++ )                              // 循环遍历+标记
    {
        tx=x+dx[i]; ty=y+dy[i];
        if( used[tx][ty]==0 )
        {
            used[tx][ty]=1;
            dfs( tx,ty );
            used[tx][ty]=0;
        }
    }
}

int main()
{
    while( cin>>n>>m>>a>>b )
    {
        memset( used,0,sizeof( used ) );
        ans=0; dfs( 0,0 );
        cout<<ans<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_63173957/article/details/125475491