马走日 DP

 附上题目链接:https://ac.nowcoder.com/acm/contest/301/F

#include
#include
#include
#include
#define mod 1000000007
using namespace std;
long long dirx[]={0,1,2,2,1,-1,-2,-2,-1};
long long diry[]={0,-2,-1,1,2,2,1,-1,-2};
long long n,m,step;
long long dp[210][210][210];
int main()
{
    while(cin>>n>>m>>step)
    {
        memset(dp,0,sizeof(dp));
        dp[0][0][0]=1;//初始只有一种方法可以到达
    for(int i=1;i<=step;i++)
    {
        for(int j=0;j=0 && k+diry[l]>=0 && j+dirx[l]
//这个裸的DFS不知道为什么一直超时,不知道怎么剪枝



#include
#include
#include
#include
#include
using namespace std;
int n,m,k,ans;
int vst[209][209];
int move1[8][2]={{2,1},{2,-1},{-2,1},{-2,-1},{1,2},{1,-2},{-1,2},{-1,-2}};
void dfs(int x,int y,int count){
    if(count>k) return;
    for(int i=0;i<8;i++){
        count++;
        x+=move1[i][0];
        y+=move1[i][1];
        if(x==n-1&&y==n-1){
            ans++;
            ans=ans%1000000007;
            return ;
        }
        if(x<=n&&y<=m&&x>=0&&y>=0&&vst[x][y]==0){
            vst[x][y]=1;
            dfs(x,y,count);
        }else{
            return ;
        }
        vst[x][y]=0;
        count--;
    }
}
 
int main(){
    while(~scanf("%d %d %d",&n,&m,&k)){
        ans=0;
        for(int i=0;i<200;i++){
            for(int j=0;j<200;j++){
                vst[i][j]=0;
            }  
        }
        dfs(0,0,0);
        cout<

 

你可能感兴趣的:(算法小笔记)