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 }

 

posted @ 2017-04-21 20:52  Lorazepam  阅读(293)  评论(0编辑  收藏  举报