360笔试题--散步


360笔试题,写完了没机会进行测试,不知道准确率多少。欢迎各位同仁讨论指正。

题目描述

饭后散步是一个很好的习惯,一天晚上,小A在一条笔直的路上散步,起点在路上某处,但是因为路上没有标识,他并不知道这个位于路上的那个位置,现在将道路划分为N-1等距的部分,你可以把这条路当成一个数轴,道路上的结点标记为1~N,起点和终点只可能是这N个点中的一个。
但是小A还提供了一个重要信息,他每隔一段时间就会用手机看一下自己走了多远,记作D,但是他并不记得他是朝着哪个方向走的,唯一可以确定的是,在两次看手机的间隔中他不会改变方向,每次看完手机后他可能继续向前或者回头走。
那么问题来了,已知他在散步过程中始终在1~N的范围内,那么符合上述条件的终点可能有多少个呢?

输入

输入第一行包含一个正整数N,M,N表示道路的长度,也是数轴上点的数量,M是小A提供的D的数量。(N,M<=20000)接下来有M行,每行一个正整数D,表示小A朝着某个方向走了D个单位。(D<=20000)

输出

输出仅包含一个正整数,表示可能的终点的数量。

样例输入

10 3
5
2
6

样例输出

8

//360笔试,散步

#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<queue>

using namespace std;
int zuo(int position, int i_move_distance, int N, vector<int> &D, vector<bool> &NN);
int you(int position, int i_move_distance, int N, vector<int> &D, vector<bool> &NN);
int qidong(int position, int i_move_distance, int N, vector<int> &D, vector<bool> &NN)
{
	int po_zuo = position - D[i_move_distance];
	int po_you = position + D[i_move_distance];

	zuo(po_zuo, i_move_distance+1, N, D,NN);
	you(po_you, i_move_distance+1, N, D,NN);

	return 0;
}

int zuo(int position, int i_move_distance, int N, vector<int> &D, vector<bool> &NN)
{
	if (position >= 1 && position<=N)
	{

		if (i_move_distance<(D.size()))
		{
			int po_zuo = position - D[i_move_distance];
			zuo(po_zuo, i_move_distance + 1, N, D,NN);
			int po_you = position + D[i_move_distance];
			you(po_you, i_move_distance+1, N, D,NN);
		}
		else
		{
			NN[position] = true;
			return position;
		}	
	}
	return 0;
}

int you(int position, int i_move_distance, int N, vector<int> &D, vector<bool> &NN)
{
	if (position >= 1 && position <= N)
	{
		if (i_move_distance<D.size())
		{
			int po_zuo = position - D[i_move_distance];
			zuo(po_zuo, i_move_distance + 1, N, D,NN);
			int po_you = position + D[i_move_distance];
			you(po_you, i_move_distance+1, N, D,NN);
		}
		else
		{
			NN[position] = true;
			return position;
		}

	}
	return 0;
}

int main(int argc, char *argv[])
{
	//给定接下来输入的行数
	int N,M;
	cin >> N>>M;
	vector<int> D;
	vector<bool> NN(N+1);
	static int count = 0;
	for (int i = 0; i < N + 1; i++)
	{
		NN[i] = false;
	}
	for (int i = 0; i < M; i++)
	{
		int j;
		cin >> j;
		D.push_back(j);
	}
	for (int i = 1; i <= N; i++)
	{
		qidong(i, 0, N, D,NN);
	}
	for (int i = 1; i <= N; i++)
	{
		if (NN[i])
		{
			count++;
		}
	}
	cout << count;
	system("pause");
	return 0;
}

菜鸡小试牛刀,欢迎同仁指正。
联系邮箱:mail@xautdipl.com

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值