【qduoj - 夏季學期創新題】騎士遊歷(遞推dp)
阿新 • • 發佈:2018-11-01
題幹:
描述
輸入
輸入包含多組資料,第一行T表示資料組數接下來每行六個整數n,m,x1,y1,x2,y2(分別表示n,m,起點座標,終點座標)
輸出
輸出T行,表示起點到終點的路徑數
輸入樣例 1
1
30 30 1 15 3 15
輸出樣例 1
2
解題報告:
這題剛開始想用dfs來寫,結果發現數字一大,連結果都跑不出來,再看題、、馬只能向右走。,於是就可以dp了啊。
AC程式碼:
#include<bits/stdc++.h> #define ll long long using namespace std; int n,m,sx,sy,ex,ey,num; bool vis[55][55]; ll maze[55][55]; //只能往下走 //void dfs(int x,int y) { // if(x == ex && y == ey) { // num++;return ; // } // if(x < 1 || x > n ||y < 1 || y > m) return ; // if(x >= ex) return ; //// if(!vis[x-1][y-2]) { //// vis[x-1][y-2]=1;dfs(x-1,y-2);vis[x-1][y-2]=0; //// } //// if(!vis[x-2][y-1]) { //// vis[x-2][y-1]=1;dfs(x-2,y-1);vis[x-2][y-1]=0; //// } //// if(!vis[x-2][y+1]) { //// vis[x-2][y+1]=1;dfs(x-2,y+1);vis[x-2][y+1]=0; //// } //// if(!vis[x-1][y+2]) { //// vis[x-1][y+2]=1;dfs(x-1,y+2);vis[x-1][y+2]=0; //// } // if(!vis[x+1][y+2]) { // vis[x+1][y+2]=1;dfs(x+1,y+2);vis[x+1][y+2]=0; // } // if(!vis[x+2][y+1]) { // vis[x+2][y+1]=1;dfs(x+2,y+1);vis[x+2][y+1]=0; // } // if(!vis[x+2][y-1]) { // vis[x+2][y-1]=1;dfs(x+2,y-1);vis[x+2][y-1]=0; // } // if(!vis[x+1][y-2]) { // vis[x+1][y-2]=1;dfs(x+1,y-2);vis[x+1][y-2]=0; // } //} int main() { ll t; cin>>t; while(t--) { scanf("%d%d%d%d%d%d",&n,&m,&sx,&sy,&ex,&ey); // memset(vis,0,sizeof vis); memset(maze,0,sizeof maze); // num = 0; // vis[sx][sy]=1; maze[sx][sy]=1; for(int i = sx+1; i<=ex; i++) { for(int j = 1; j<=n; j++) { maze[i][j] = maze[i-1][j-2]+maze[i-1][j+2]+maze[i-2][j-1]+maze[i-2][j+1]; } } // dfs(sx,sy); printf("%lld\n",maze[ex][ey]); } return 0 ; }