UPCOJ2012 The King’s Walk(dp)
题意:
给你一个n*n的地图,起始位置和目标位置
你每次可以八向走
问你有多少种最少步数到达的方案
答案取模
思路:
走的步数是确定的,是横坐标、纵坐标只差较大的那个
然后就是用确定的步数走另一个坐标差这样的距离
每次可以不走,前进一步,后退一步,不超出地图范围即可
这尼玛简直看出我这个渣渣的实力。。
想了一晚上都没想到最后还是问的别人才恍然大悟
水题,为什么想不到!
简直菜鸡!
/* *********************************************** Author :devil Created Time :2016/6/10 20:8:17 ************************************************ */ #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <cmath> #include <stdlib.h> using namespace std; const int mod=5318008; const int N=5010; int n,dp[N],dp2[N]; void solve(int m,int st,int ed) { memset(dp,0,sizeof(dp)); dp[st]=1; for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { dp2[j]=dp[j]; if(j>0) dp2[j]+=dp[j-1]; if(j<n-1) dp2[j]+=dp[j+1]; } for(int j=0;j<n;j++) dp[j]=dp2[j]%mod; } printf("%d\n",dp[ed]); } int main() { //freopen("in.txt","r",stdin); int t,x1,y1,x2,y2; scanf("%d",&t); while(t--) { scanf("%d%d%d%d%d",&n,&x1,&y1,&x2,&y2); if(abs(x1-x2)>abs(y1-y2)) solve(abs(x1-x2),y1-1,y2-1); else solve(abs(y1-y2),x1-1,x2-1); } return 0; }