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;
}

 

posted on 2016-06-10 20:08  恶devil魔  阅读(309)  评论(0编辑  收藏  举报

导航