蓝桥杯2020年第十一届国赛真题-皮亚诺曲线距离

这篇博客分享了一种暴力方法来解决一个关于三维网格中特定路径计数的问题。作者通过递归和四步操作(addans1-4)探讨了从起点到终点的不同路径组合,适用于国赛等竞赛场景。虽然效率不高,但提供了解决思路。
摘要由CSDN通过智能技术生成

我找不到满分题解,结果我肝一个下午肝出来了,有一说一,在考场碰到这题估计要没,今年国赛加油把,方法过于暴力,仅供参考

 

#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<set>
#include<cmath> 
#include<queue>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n;
ll ans;

void addans1(ll f,ll i,ll j) {
	f *= f;
	if(i == 1) {
		if(j == 1) {
		}else if(j == 2){
			ans += f * 1;
		}else if(j == 3) {
			ans += f * 2;
		}
	}else if(i == 2) {
		if(j == 3) {
			ans += f * 3;
		}else if(j == 2) {
			ans += f * 4;
		}else if(j == 1) {
			ans += f * 5;
		}
	}else if(i == 3) {
		if(j == 1) {
			ans += f * 6;
		}else if(j == 2) {
			ans += f * 7;
		}else if(j == 3) {
			ans += f * 8;
		}
	}
}

void addans2(ll f,ll i,ll j) {
	f *= f;
	if(i == 3) {
		if(j == 2) {
			ans += f * 1;
		}else if( j == 3) {
			ans += f * 2;
		}
	}else if(i == 2) {
		if(j == 3){
			ans += f * 3;
		}else if(j == 2) {
			ans += f * 4;
		}else if(j == 1) {
			ans += f * 5;
		}
	}else if(i == 1){
		if(j == 1) {
			ans += f * 6;
		}else if(j == 2){
			ans += f * 7;
		}else if(j == 3){
			ans += f * 8;
		}
	}
}

void addans3(ll f,ll i,ll j) {
	f *= f;
	if(i == 1) {
		if(j == 2)
			ans += f * 1;
		else if(j == 1)
			ans += f * 2;
	}else if(i == 2) {
		if(j == 1) {
			ans += f * 3;
		}
		else if(j == 2)
			ans += f * 4;
		else if(j == 3)
			ans += f * 5;
	}else if (i == 3) {
		if(j == 3)
			ans += f * 6;
		else if(j == 2)
			ans += f * 7;
		else if(j == 1)
			ans += f * 8;
	}
}
void addans4(ll f,ll i,ll j) {
	f *= f;
	
	if(i == 3) {
		if(j == 2) {
			ans += f * 1;
		}
		else if(j == 1)
			ans += f * 2;
	}else if(i == 2) {
		if(j == 1)
			ans += f * 3;
		else if(j == 2)
			ans += f * 4;
		else if(j == 3)
			ans += f * 5;
	}else if(i == 1) {
		if(j == 3)
			ans += f * 6;
		else if(j == 2)
			ans += f * 7;
		else if(j == 1)
			ans += f * 8;
	}
}
void dfs(ll x,ll y,ll k,int tpp) {
	if(k > n || k == 0)
		return;
	ll t = 1;
	for(int i = 1;i <= k;i++) {
		t *= 3;
	}
	if(x > t || y > t) {
		dfs(x,y,k+1,tpp);
	}else{
		ll f = t / (3);
		ll xx = 0,yy = 0;
		bool falg = 0;
		for(ll i = 1;i <= 3;i++) {
			for(ll j = 1;j <= 3;j++) {
				if(xx + i * f >= x && xx + (i - 1) * f < x &&
				 yy + j * f >= y && yy + (j - 1) * f < y) {
					if(tpp == 1)
						addans1(f,i,j);
					else if(tpp == 2)
						addans2(f,i,j);
					else if(tpp == 3)
						addans3(f,i,j);
					else
						addans4(f,i,j);
					if(tpp == 1) {
						if( (i == 1 && j == 1) || (i == 1 && j == 3) || (i == 3 && j == 1) || (i == 3 && j == 3)) {
							dfs(x - (i - 1) * f,y - (j - 1) * f,k - 1,1);
						}else if((i == 1 && j == 2) || (i == 3 && j == 2) ) {
							dfs(x - (i - 1) * f,y - (j - 1) * f,k - 1,2);
						}else if((i == 2 && j == 3) || (i == 2 && j == 1)){
							dfs(x - (i - 1) * f,y - (j - 1) * f,k - 1,3);
						}else
							dfs(x - (i - 1) * f,y - (j - 1) * f,k - 1,4);
					}else if(tpp == 2) {
						if( (i == 1 && j == 1) || (i == 1 && j == 3) || (i == 3 && j == 1) || (i == 3 && j == 3)) {
							dfs(x - (i - 1) * f,y - (j - 1) * f,k - 1,2);
						}else if((i == 1 && j == 2) || (i == 3 && j == 2) ) {
							dfs(x - (i - 1) * f,y - (j - 1) * f,k - 1,1);
						}else if((i == 2 && j == 3) || (i == 2 && j == 1)){
							dfs(x - (i - 1) * f,y - (j - 1) * f,k - 1,4);
						}else
							dfs(x - (i - 1) * f,y - (j - 1) * f,k - 1,3);
					}else if(tpp == 3) {
						if( (i == 1 && j == 1) || (i == 1 && j == 3) || (i == 3 && j == 1) || (i == 3 && j == 3)) {
							dfs(x - (i - 1) * f,y - (j - 1) * f,k - 1,3);
						}else if((i == 1 && j == 2) || (i == 3 && j == 2) ) {
							dfs(x - (i - 1) * f,y - (j - 1) * f,k - 1,4);
						}else if((i == 2 && j == 3) || (i == 2 && j == 1)){
							dfs(x - (i - 1) * f,y - (j - 1) * f,k - 1,1);
						}else
							dfs(x - (i - 1) * f,y - (j - 1) * f,k - 1,2);
					}else if (tpp == 4) {
						if( (i == 1 && j == 1) || (i == 1 && j == 3) || (i == 3 && j == 1) || (i == 3 && j == 3)) {
							dfs(x - (i - 1) * f,y - (j - 1) * f,k - 1,4);
						}else if((i == 1 && j == 2) || (i == 3 && j == 2) ) {
							dfs(x - (i - 1) * f,y - (j - 1) * f,k - 1,3);
						}else if((i == 2 && j == 3) || (i == 2 && j == 1)){
							dfs(x - (i - 1) * f,y - (j - 1) * f,k - 1,2);
						}else
							dfs(x - (i - 1) * f,y - (j - 1) * f,k - 1,1);
					}
					falg = 1;
					break;
				}
			}
			if(falg)
				break;
		}
	}
	
}

ll cale(ll x,ll y) {
	ans = 0;
	dfs(x,y,1,1);
	return ans;
}

int main()
{
	ll x1,y1,x2,y2;
	cin>>n;
	cin>>x1>>y1>>x2>>y2;
	ll a = cale(x1 + 1,y1 + 1);
	ll b = cale(x2 + 1,y2 + 1);
	cout<<abs(a - b);
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
绘制Peano曲线和Koch曲线可以使用MATLAB中的绘图函数进行实现,下面是详细的代码实现: 1. 绘制Peano曲线 ```matlab % 定义绘制Peano曲线的函数 function PeanoCurve(n) % n为绘制的阶数 if n == 0 x = [0 1 1 2 2 3 3 2 2 1 1 0]; y = [0 0 1 1 0 0 1 1 2 2 1 1]; plot(x,y,'k'); else hold on; PeanoCurve(n-1); % 递归绘制子曲线 axis equal; % 设置坐标轴比例相等 x = get(gca,'Xtick'); y = get(gca,'Ytick'); set(gca,'XTick',[],'YTick',[]); % 隐藏坐标轴 x = [x(1) x x(end)]; y = [y(1) y y(end)]; % 添加边框 x1 = x(1:2:end); x2 = x(2:2:end); y1 = y(1:2:end); y2 = y(2:2:end); x = [x1;x2;x2;x1;x1]; y = [y1;y1;y2;y2;y1]; % 组合子曲线 plot(x,y,'k'); hold off; end end ``` 使用方法: ```matlab PeanoCurve(3); % 绘制3阶Peano曲线 ``` 2. 绘制Koch曲线 ```matlab % 定义绘制Koch曲线的函数 function KochCurve(n) % n为绘制的阶数 if n == 0 x = [0 1 1/2 1/2 1 1]; y = [0 0 sqrt(3)/2 sqrt(3) sqrt(3) 0]; plot(x,y,'k'); else hold on; KochCurve(n-1); % 递归绘制子曲线 axis equal; % 设置坐标轴比例相等 x = get(gca,'Xtick'); y = get(gca,'Ytick'); set(gca,'XTick',[],'YTick',[]); % 隐藏坐标轴 x = [x(1) x x(end)]; y = [y(1) y y(end)]; % 添加边框 x1 = x(1:2:end); x2 = x(2:2:end); y1 = y(1:2:end); y2 = y(2:2:end); x = [x1;(x1+x2)/2;(x1+x2)/2;(x2-x1)/2+x1;x2]; y = [y1;(y1+y2)/2;(y1+y2)/2;(y2-y1)/2+y1;y2]; % 组合子曲线 plot(x,y,'k'); hold off; end end ``` 使用方法: ```matlab KochCurve(3); % 绘制3阶Koch曲线 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值