ACM: HDU 2563 统计问题-DFS+打表

HDU 2563 统计问题

Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

HDU 2563

Description

在一无限大的二维平面中,我们做如下假设: 
1、  每次只能移动一格; 
2、  不能向后走(假设你的目的地是“向上”,那么你可以向左走,可以向右走,也可以向上走,但是不可以向下走); 
3、  走过的格子立即塌陷无法再走第二次;

求走n步不同的方案数(2种走法只要有一步不一样,即被认为是不同的方案)。

Input

首先给出一个正整数C,表示有C组测试数据 
接下来的C行,每行包含一个整数n (n<=20),表示要走n步。

Output

请编程输出走n步的不同方案总数; 
每组的输出占一行。

Sample Input

2
1
2

Sample Output

3
7
/*/
中文题,有点类似以前做过的小蜜蜂那题,规定一个方向后只能沿着三个方向去移动了。

所以每次移动只有3种方向可以走,而且还要标记是否已经走过这条路,所以思路很清楚直接DFS。

但是DFS会TLE,输入的数字在1~20,数据不多,直接打表。

AC代码:
/*/
#include"map"
#include"cmath"
#include"string"
#include"cstdio"
#include"vector"
#include"cstring"
#include"iostream"
#include"algorithm"
using namespace std;
typedef long long LL;
const int MX=202;
#define memset(x,y) memset(x,y,sizeof(x))
#define FK(x) cout<<"【"<<x<<"】"<<endl

int step,ans;
bool vis[MX][MX];
int ans2[22]= {0,3,7,17,41,99,239,577,1393,3363,8119,19601,47321,114243,275807,665857,1607521,3880899,9369319,22619537,54608393,0};
//因为DFS全部计算后会超时,而且输入只有1-20,所以直接打出全部的数表

void DFS(int dir,int x,int y,int tot) {
	if(tot==step) {       //如果步数已经达到了就计数。
//	FK("YES"<<x<<","<<y<<","<<tot);  //确认
		ans++;
		return ;
	}
	for(int i=1; i<=3; i++) {
		if(i==1)x++;       //每种情况对应的位移。
		if(i==2)y++;
		if(i==3)x--;
		if(!vis[x][y]) {
			vis[x][y]=1;//标记已经塌陷的路
			tot++;
			DFS(i,x,y,tot);
			vis[x][y]=0;
			tot--;
		}
		if(i==1)x--;
		if(i==2)y--;
		if(i==3)x++;
	}
}

int main() {
	int T,x;
	scanf("%d",&T);
	while(T--) {
		scanf("%d",&x);/*这里是打表之后加上的*/
//	for(step=1; step<=20; step++) {
//		ans=0;
//		memset(vis,0);
//			vis[100][100]=1;//起点已经塌陷
//			for(int i=1; i<=3; i++) {
//				int xx=100,yy=100;//起点开始,向三个可行方向去深搜
//				if(i==1)xx++;
//				if(i==2)yy++;
//				if(i==3)xx--;
//				vis[xx][yy]=1;//标记路已经塌陷
//				DFS(i,xx,yy,1);
//				vis[xx][yy]=0;
//
//			}
			printf("%d\n",ans2[x]);
//		}
	}
	return 0;
}

  

时间: 2024-12-21 08:16:24

ACM: HDU 2563 统计问题-DFS+打表的相关文章

HDU 2563 统计问题 (DFS + 打表)

统计问题 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6506    Accepted Submission(s): 3836 Problem Description 在一无限大的二维平面中,我们做例如以下如果: 1.  每次仅仅能移动一格: 2.  不能向后走(如果你的目的地是"向上",那么你能够向左走,能够向右走,也能

[ACM] hdu 1251 统计难题 (字典树)

统计难题 Problem Description Ignatius近期遇到一个难题,老师交给他非常多单词(仅仅有小写字母组成,不会有反复的单词出现),如今老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). Input 输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每一个提问都是一个字符串. 注意:本题仅仅有一组測试数据,处理到文件结束. Out

hdu 2563 -统计问题 【递推关系】

统计问题 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6525    Accepted Submission(s): 3843 链接:hdu 2563 Problem Description 在一无限大的二维平面中,我们做如下假设: 1.  每次只能移动一格: 2.  不能向后走(假设你的目的地是"向上",那么你可以向左走

HDU 2563 统计问题(递推)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2563 将向上移的步数设为a[n],将向左右移的步数设为b[n],有a[n]=a[n-1]+b[n-1],因为之前一步是向哪个方向,上移只有向上一个方向:b[n]=a[n-1]*2+b[n-1],因为之前一步若向上移,则接下来就有左右两个方向都可以移动,若之前向左或右,则这一步只能按照原来的方向移(原来的路已经坍陷). 得到走n步的方案有f[n]=a[n]+b[n],又由a[n]和b[n]的递推公式得

HDU 2563 统计问题(递归,思维题)

统计问题 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 8705    Accepted Submission(s): 5157 Problem Description 在一无限大的二维平面中,我们做如下假设: 1.  每次只能移动一格: 2.  不能向后走(假设你的目的地是“向上”,那么你可以向左走,可以向右走,也可以向上走,但是不

hdu 2563 统计问题

统计问题 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5633 Accepted Submission(s): 3308 Problem Description 在一无限大的二维平面中,我们做如下假设: 1. 每次只能移动一格: 2. 不能向后走(假设你的目的地是"向上",那么你可以向左走,可以向右走,也可以向上走,但是不可以向

[ACM] hdu 3555 Bomb (数位DP,统计1-N中含有“49”的总数)

Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Submission(s): 7187 Accepted Submission(s): 2512 Problem Description The counter-terrorists found a time bomb in the dust. But this time the terrorists impro

HDU 3158 PropBot(DFS)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3158 Problem Description You have been selected to write the navigation module for PropBot. Unfortunately, the mechanical engineers have not provided a lot of flexibility in movement; indeed, the PropBot

[ACM] hdu 2089 不要62(数位Dp)

不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 19043    Accepted Submission(s): 6442 Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer). 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就