小乐乐下象棋
https://ac.nowcoder.com/acm/contest/301/F
题目描述
小乐乐一天天就知道玩,这一天又想玩象棋。
我们都知道马走日。
现在给定一个棋盘,大小是n*m,把棋盘放在第一象限,棋盘的左下角是(0,0),右上角是(n - 1, m - 1);
小乐乐想知道,一个马从左下角(0, 0)开始,走了k步之后,刚好走到右上角(n - 1, m - 1)的方案数。
我们都知道马走日。
现在给定一个棋盘,大小是n*m,把棋盘放在第一象限,棋盘的左下角是(0,0),右上角是(n - 1, m - 1);
小乐乐想知道,一个马从左下角(0, 0)开始,走了k步之后,刚好走到右上角(n - 1, m - 1)的方案数。
输入描述:
输入:多组样例输入,每组一行,三个整数n, m, k(1 <= n, m, k <= 200),如题目所示。
输出描述:
输出:输出答案 mod 1000000007
示例1
输入
4 4 2
输出
2
1 #include<iostream> 2 #include<algorithm> 3 #include<string> 4 #include<map> 5 #include<vector> 6 #include<cmath> 7 #include<string.h> 8 #include<stdlib.h> 9 #include<queue> 10 #include<cstdio> 11 #define ll long long 12 const long long MOD=1000000007; 13 using namespace std; 14 15 16 int dir[8][2]={1,2,-1,-2,1,-2,-1,2,2,1,-2,-1,-2,1,2,-1}; 17 int book[205][205][205]; 18 long long n,m,k; 19 long long dfs(int x,int y,int step){ 20 if(book[x][y][step]!=-1){ 21 return book[x][y][step]; 22 } 23 long long ans=0; 24 for(int i=0;i<8;i++){ 25 int xx=x+dir[i][0]; 26 int yy=y+dir[i][1]; 27 if(xx>=0&&xx<n&&yy>=0&&yy<m&&step<k){ 28 ans=(ans+dfs(xx,yy,step+1))%MOD; 29 } 30 } 31 book[x][y][step]=ans; 32 return ans; 33 } 34 35 int main(){ 36 while(cin>>n>>m>>k){ 37 for(int i=0;i<=n;i++) for(int j=0;j<=m;j++) for(int w=0;w<=k;w++) book[i][j][w]=-1; 38 book[n-1][m-1][k]=1; 39 cout<<dfs(0,0,0)<<endl; 40 } 41 }