J - The King‘s Walk Kattis - kingswalk

借鉴博客
题目链接:J - The King’s Walk Kattis

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x);
typedef pair<int,int> PII;
typedef long long ll;
const int mod = 5318008;
const int INF = 0x3f3f3f3f;
const int N = 5e3+50;
int n,m,f[2][N];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        memset(f,0,sizeof(f));
        cin>>n;
        int a,b,c,d;
        cin>>a>>b>>c>>d;
        int x,y;
        x=abs(a-c);
        y=abs(b-d);
        if(x>y)//把大的当成y最大值,然后对于小的长度差可以出现折返,也就是需要n来折返求解
        {
            m=x,x=min(b,d),y=max(b,d);
        }
        else
        {
            m=y,x=min(a,c),y=max(a,c);
        }
        //下面的x,y谁大谁小无所谓。
        f[0][x]=1;
        for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++)//小的x轴向不能直接左右横移因为还原到本质上去之后就是我们对于短程的方向还直着走会增加路径长度。
            {
                int k=i-1&1;
                f[i&1][j]=f[k&1][j-1]+f[k][j]+f[k][j+1];
                f[i&1][j]%=mod;
            }
        }
        cout<<f[m&1][y]<<endl;
    }
    return 0;
}

上一篇:TKO 2-2需要考虑周全的贪心问题--田忌赛马


下一篇:Vulnhub靶场初体验——Who Wants To Be King: 1