蓝桥杯国赛 皮亚诺曲线距离

Posted Jozky86

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝桥杯国赛 皮亚诺曲线距离相关的知识,希望对你有一定的参考价值。

参考博客

题意:


题解:

这个很恶魔
本质好说就是找规律,但是贼难写。。
找了篇题解,做法就是大化小,将大阶化为成小阶,计算出离远点的距离。。。我感觉我是写不出来。。
挺秒的,要推公式估计要一阵子

代码:

#include<iostream>
#include<utility>
#include<vector>
#include<cmath>
 
using namespace std;
 
typedef pair < int , int > location;
typedef long long ll;
ll cacl(ll n,location loca)//n级皮亚诺,此时的坐标位置左下角为原点 
	ll pre_len=pow(3,n-1);
	ll total=0;
	location xy(loca.first/pre_len,loca.second/pre_len);
	ll x=loca.first,y=loca.second;
	ll num=0;
	if(xy.first==0)
	
		num=xy.second+1;
	
	else if(xy.first==1)
	
		if(xy.second==2)num=4;
		else if(xy.second==1)num=5;
		else num=6;
	else
		num=7+xy.second;
	
	total+=pre_len * pre_len * (num-1);
	if(n==1)
		return total;//结束标志 
	
	location pre(loca);
	
	if(num==1);
	else if(num==2)
		pre=make_pair(-(x-pre_len+1),y-pre_len);
	
	else if(num==3)
		pre=make_pair(x,y-2*pre_len);
	
	else if(num==4)
		pre=make_pair(x-pre_len,-(y-3*pre_len+1));
	
	else if(num==5)
		pre=make_pair(-(x-2*pre_len+1),-(y-2*pre_len+1));
	
	else if(num==6)
		pre=make_pair(x-pre_len,-(y-pre_len+1));
	
	else if(num==7)
		pre=make_pair(x-2*pre_len,y);
	
	else if(num==8)
		pre=make_pair(-(x-3*pre_len+1),y-pre_len);
	
	else
		pre=make_pair(x-2*pre_len,y-2*pre_len);
	
	return total+cacl(n-1,pre);

 
int main()
	ll n,x1,y1,x2,y2;
	cin>>n>>x1>>y1>>x2>>y2;
	location first(x1,y1),second(x2,y2);
	//cout<<first.first<<endl;
	cout<<abs(cacl(n,first)-cacl(n,second));
	return 0;

以上是关于蓝桥杯国赛 皮亚诺曲线距离的主要内容,如果未能解决你的问题,请参考以下文章

蓝桥杯国赛CB组 DP 总结

第十二届蓝桥杯国赛括号线段树

蓝桥杯国赛真题08python约分 蓝桥杯青少年组python编程 蓝桥杯国赛真题解析

蓝桥杯国赛真题08python约分 蓝桥杯青少年组python编程 蓝桥杯国赛真题解析

蓝桥杯国赛真题05python读数系统 蓝桥杯青少年组python编程 蓝桥杯国赛真题解析

蓝桥杯国赛真题04python输出平方 蓝桥杯青少年组python编程 蓝桥杯国赛真题解析