给你一个方格图,你在(0,0),最大是(x,y),x是横坐标,y纵坐标
你的基地在(sx,sy),然后你开头是面朝y轴正方向,你每次只能往前走一格,或者右转一格
问你有多少种不同的方法到达基地
画画图发现,只有那种向右螺旋的线可以到达基地
考虑这个点四周,直线的个数
算出最多能绕多少条边
然后每次就给一个方位的++,然后组合数算一下
代码:
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <cmath>
#include <string>
#include <vector>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <sstream>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#pragma comment(linker,"/STACK:102400000,102400000")
using namespace std;
#define MAX 100005
#define MAXN 1000005
#define maxnode 105
#define sigma_size 30
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define lrt rt<<1
#define rrt rt<<1|1
#define middle int m=(r+l)>>1
#define LL long long
#define ull unsigned long long
#define mem(x,v) memset(x,v,sizeof(x))
#define lowbit(x) (x&-x)
#define pii pair<int,int>
#define bits(a) __builtin_popcount(a)
#define mk make_pair
#define limit 10000
//const int prime = 999983;
const int INF = 0x3f3f3f3f;
const LL INFF = 0x3f3f;
const double pi = acos(-1.0);
const double inf = 1e18;
const double eps = 1e-6;
const LL mod = 100000007;
const ull mx = 133333331;
/*****************************************************/
inline void RI(int &x) {
char c;
while((c=getchar())<'0' || c>'9');
x=c-'0';
while((c=getchar())>='0' && c<='9') x=(x<<3)+(x<<1)+c-'0';
}
/*****************************************************/
LL C[2005][2005];
void init(){
mem(C,0);
C[0][0]=1;
for(int i=1;i<=2000;i++){
C[i][0]=C[i][i]=1;
for(int j=1;j<i;j++){
C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
}
}
}
int main(){
//freopen("in.txt","r",stdin);
int t;
cin>>t;
init();
while(t--){
int x,y,sx,sy;
scanf("%d%d%d%d",&x,&y,&sx,&sy);
if(sx==0||sy==y){
printf("1\n");
continue;
}
int L=sx-1;
int R=x-sx;
int U=y-sy;
int D=sy;
LL ans=1;
int mini=min(min(L,R),min(U,D));
int num=4*mini;
if(U==mini) num=num;
else if(R==mini) num++;
else if(D==mini) num+=2;
else num+=3;
int a[5];
mem(a,0);
int j=0;
for(int i=0;i<num;i++){
a[j]++;
ans+=C[U][a[0]]*C[R][a[1]]%mod*C[D][a[2]]%mod*C[L][a[3]]%mod;
if(ans>=mod) ans-=mod;
j=(j+1)%4;
}
cout<<ans<<endl;
}
return 0;
}