ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

蓝桥杯---螺旋射线(模拟,数学规律)

2021-11-28 16:02:02  阅读:150  来源: 互联网

标签:--- 螺旋 int len 蓝桥 ++ 2n include check


 

 三种做法        1.模拟每次走一个点        O(10的18次方)

                        2.模拟每次走一条边        O(10的9次方)

                        3.找数学规律                   O(1)

1.模拟方法

#include <iostream>
#include <algorithm>
using namespace std;

int X, Y;

int main()
{
	cin >> X >> Y;
	int x = 0, y = 0;
	int len = 0;
	int i = 1, b = 1;
	while (check(x, y))
	{
		if (i == 1)				//左走b次
		{
			for (int j = 0;j < b && check(x, y);j++)
				x = x - 1, len++;
			if (!check(x, y))
				break;
		}
		if (i == 2)				//上走b次
		{
			for (int j = 0;j < b && check(x, y);j++)
				y = y + 1, len++;
			b++;				//步数+1
			if (!check(x, y))
				break;
		}
		if (i == 3)				//右走b次
		{
			for (int j = 0;j < b && check(x, y);j++)
				x = x + 1, len++;
			if (!check(x, y))
				break;
		}
		if (i == 4)				//下走b次
		{
			for (int j = 0;j < b && check(x, y);j++)
				y = y - 1, len++;
			b++;
			if (!check(x, y))
				break;

		}
		i = i % 4 + 1;
	}
	cout << len;
}

2.找规律做法

 我们发现如果每个以一个正方形向外扩展,正方形边长(2,4,6...)那么他的

右上顶点距离是(2n)*(2n)                x==y,x>0,y>0

左上顶点距离是(2n-1)*(2n)             x==-y,x<0,y>0

右下顶点距离是(2n)*(2n+1)            x==-y,x>0,y<0

左下顶点距离是(2n-1)*(2n-1)         x==y,x<0,y<0

如果是在上直线       |x|<=y(左走到右)

           在下直线       |x|<=|y|+1(从右走到左)

           在左直线       |y|<=|x|    (从下走到上)

           在右直线       |y|<=x      (从上走到下)

 

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
/*
找数学规律问题\线性规划
*/
typedef long long ll;
int main()
{
	ll x, y;
	cin >> x >> y;
	ll res = 0;
	if (fabs(x) <= y)
	{
		int n = x;
		res = (2 * y - 1) * (2 * y) + y + x;
	}
	else if (fabs(y) <= x)
	{
		res = (2 * x) * (2 * x) + x - y;
	}
	else if (fabs(x) <= fabs(y) + 1&&y<0)			//确保是在下面那条边
	{
		ll n = fabs(y);				//y不变,但是y的值为负数,计算可能出错,于是取绝对值
		res = (2 * n) * (2 * n + 1) + n - x;
	}
	else if (fabs(y) <= fabs(x))
	{//特殊
		ll n = fabs(x);				//x不变,但是x的值是负数
		res = (2 * n - 1) * (2 * n - 1) + y - (-n + 1);
		//这里加一是因为点在左边那条边的话,边的长度是2*n-1,x轴下面占n-1,上面占n
	}
	cout << (ll)res;
}

标签:---,螺旋,int,len,蓝桥,++,2n,include,check
来源: https://blog.csdn.net/qq12323qweeqwe/article/details/121591478

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有