Sicily 1415. Honeycomb Walk
2014-10-02 23:17
381 查看
题目链接 soj.sysu.edu.cn/1415
题目大意
蜂巢上的每个格子是六边形的,一只蜜蜂想在蜂巢上散步,问在蜂巢上行走n步之后,蜜蜂回到原点的散步路线总共有多少种
思路
当蜜蜂走到第n步时,只要将所有相邻格子在走第n-1步时的路线数加起来就可以了,这属于数值递推类型的题目,思路不难。不过用来表示蜂巢的数据结构就有点tricky,我们可以使用一个二维数据表示一个蜂巢,而对于任意一个格子,其相邻的6个格子则用
dp[ i - 1 ][ j ] dp[ i - 1][ j + 1]
dp[ i - 1 ][ j ] dp[ i ][ j ] dp[ i ][ j + 1 ]
dp[ i + 1 ][ j - 1 ] dp[ i + 1 ][ j ]
代码
题目大意
蜂巢上的每个格子是六边形的,一只蜜蜂想在蜂巢上散步,问在蜂巢上行走n步之后,蜜蜂回到原点的散步路线总共有多少种
思路
当蜜蜂走到第n步时,只要将所有相邻格子在走第n-1步时的路线数加起来就可以了,这属于数值递推类型的题目,思路不难。不过用来表示蜂巢的数据结构就有点tricky,我们可以使用一个二维数据表示一个蜂巢,而对于任意一个格子,其相邻的6个格子则用
dp[ i - 1 ][ j ] dp[ i - 1][ j + 1]
dp[ i - 1 ][ j ] dp[ i ][ j ] dp[ i ][ j + 1 ]
dp[ i + 1 ][ j - 1 ] dp[ i + 1 ][ j ]
代码
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; int dp[20][20][20]; int dirx[] = {0, 0, 1, 1, -1, -1}; int diry[] = {1, -1, 0, -1, 0, 1}; bool ok(int i, int j, int d) { if (i + dirx[d] >= 0 && i + dirx[d] < 20) if (j + diry[d] >= 0 && j + diry[d] < 20) return true; return false; } void init() { memset(dp, 0, sizeof(dp)); dp[10][10][0] = 1; for (int k = 1; k < 20; k ++) for (int i = 0; i < 20; i ++) for (int j = 0; j < 20; j ++) for (int d = 0; d < 6; d ++) if (ok(i, j, d)) { dp[i][j][k] += dp[i+dirx[d]][j+diry[d]][k-1]; } } int main() { int n, t; init(); cin >> n; for (int i = 0; i < n; i ++) { cin >> t; cout << dp[10][10][t] << endl; } return 0; }
相关文章推荐
- sicily 1415. Honeycomb Walk【动态规划】
- POJ 3036 Honeycomb Walk
- Sicily 4478. Walk This Way
- Sicily 1120. Walk Through the For
- 2489. Honeycomb Walk
- POJ-3036 Honeycomb Walk 简单DP
- hdu 2323 Honeycomb Walk
- 南邮 OJ 1498 Honeycomb Walk
- Sicily. Walk This Way
- HDU 2323 Honeycomb Walk
- POJ 3036 Honeycomb Walk(DP)
- poj 3036 Honeycomb Walk 暴力枚举 dp
- 1415: 小ho的01串 [字符串]
- 1415: [Noi2005]聪聪和可可
- Getting Started with Microsoft Windows Workflow Foundation: A Developer Walkthrough
- bzoj1415 [Noi2005]聪聪和可可(期望概率DP+最短路)
- Sicily 1018 A Card Trick —— 教你玩一个纸牌魔术
- sicily1000. 词法分析程序设计 **
- 跑龙套 walk-on
- Python os.walk的用法与举例