您的位置:首页 > 其它

POJ 3036 Honeycomb Walk

2017-04-21 20:52 337 查看

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
[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
[7][7] << endl;
28     }
29     return 0;
30 }

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: