借鉴博客
题目链接: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;
}