POJ 3036 Honeycomb Walk
http://poj.org/problem?id=3036
在每一个格子可以转移到与这个各自相邻的六个格子
那么设置转移变量 只需要六个 int d[6][2] = {-1, 0, -1, 1, 0, 1, 1, 0, 1, -1, 0, -1};
然后设dp[i][j][k] : 第i步走到(j ,k) 的方式数
那么转移方程:
for (int m = 0; m < 6; m++)
dp[i][j][k] += dp[i-1][j+d[m][0]][k+d[m][1]]
三个维度的状态 最后得到dp[n][O][O] 就是最后回到原点的个数 六边形只需要坐标六个变化
因为最多n = 14
最多上下最多可以走14 / 2 = 7个
所以设置(7 , 7) 为原点
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #define INF 0x3fffffff 5 using namespace std; 6 7 8 long long dp[16][32][32]; 9 int d[6][2] = {-1, 0, -1, 1, 0, 1, 1, 0, 1, -1, 0, -1}; //开始坐标标错了 10 int dx[]={1,0,1,-1,0,-1}; 11 int dy[]={0,1,1,0,-1,-1}; 12 int main() 13 { 14 memset(dp, 0, sizeof(dp)); 15 dp[0][7][7] = 1; 16 for (int i = 1; i <= 14; i++) 17 for(int j = 0; j <= 14; j++) 18 for(int k = 0; k <= 14; k++) 19 for(int m = 0; m < 6; m++) 20 dp[i][j][k] += dp[i-1][j+d[m][0]][k+d[m][1]]; 21 int T; 22 cin >> T; 23 while (T--) 24 { 25 int n; 26 cin >> n; 27 cout << dp[n][7][7] << endl; 28 } 29 return 0; 30 }