zju-Gift?!-dfs

题目的意思很简单:


青蛙要到指定的岩石拿礼物,前提是:

   1.必须从岩石1出发

  2.以后的每一次,第(i)次,要么往前 2 * i - 1步,要么往后2 *  i  - 1 步

 3.要是在跳的过程中,跳到了河的左岸或者是右岸,那么游戏结束,意味着青蛙拿不到礼物了

代码要注意的地方:

 1.因为要满足第一次跳的是到第一块岩石,怎么满足这个条件了???  --------- 我们用cur表示当前的位置,用i来表示跳到了第几次,

  那么当(cur <= 0  && i > 1)的时候,是不是可以判断不满足呢?   也就是当前位置还在左岸时,步数已经超过了1,这是不允许的

2.要满足:跳到了河的左岸或者是右岸,就结束游戏,也就是满足 if(cur > n || cur < 0) return;

 3.最关键的一点就是:由于给出的数据很大,因此会超时,怎么办呢。。看到学姐用了 n > 50 的时候,就直接输出满足条件,加上去,果然对了、



#include<stdio.h>
#include <iostream>

using namespace std;

long n, m;
int  flag;
void dfs(int cur, int i) {
	if(cur == m) { 
		flag = 1;
		return;
	}
	if(cur > n || cur < 0) return;
	if(cur <= 0 && i > 1) return;
	int dis = 2 * i - 1;
	dfs(cur + dis, i + 1);
	dfs(cur - dis, i + 1);
}
int main() {
	while(scanf("%ld%ld", &n, &m) != EOF) {
		if(n == 0 && m == 0) break;
		if(n > 50) {
			printf("Let me try!\n");
			continue;
		}
		flag = 0;
		dfs(0, 1);
		if(flag)
			printf("Let me try!\n");
		else 
			printf("Don't make fun of me!\n");
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值