您的位置:首页 > 其它

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 ]



代码

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: