首页 > 其他分享 >T265119 拯救公主--题解

T265119 拯救公主--题解

时间:2022-08-14 10:55:33浏览次数:66  
标签:索菲亚 填充 -- 题解 T265119 int 划分 方格 砖块

题目描述

公主索菲亚被关在一个有大小一样的方格构成的四四方方的迷宫里面,索菲亚就站在其中一个方格子上,拯救方案是这样的:要用一些地砖把公主所在的方格子之外的格子都铺上,那么索菲亚就得救了。注意索菲亚所在的这一个格子不能用地砖铺上。地砖有如下四种规格(如图):

并且每个方格只能用一层地砖铺设,迷宫的大小是2^k * 2^k的方形。

输入格式

输入包含 2行。
第一行:k,即给定迷宫的大小是 2k*2k
第二行:x,y,即给出索菲亚所在方格的坐标(x 为行坐标,y为列坐标),x 和 yy之间以一个空格隔开。

输出格式

铺设砖块的方案:每一行是x y c(x,y 是砖块拐角的行坐标和列坐标,c是所用砖块的形状,具体见上面的图,砖块形状分别用 1,2,3,4 表示,x,y,cx,y,c 之间以空格隔开)。

题解

算法思想:
把迷宫从中间划分成四个部分,
若索菲亚所在方格在左上方时,在划分出用1号砖块填充,这样填充的砖块可以作为其他三个划分的缺口
若索菲亚所在方格在右上方时,在划分出用2号砖块填充,这样填充的砖块可以作为其他三个划分的缺口
若索菲亚所在方格在左下方时,在划分出用3号砖块填充,这样填充的砖块可以作为其他三个划分的缺口
若索菲亚所在方格在右下方时,在划分出用4号砖块填充,这样填充的砖块可以作为其他三个划分的缺口
然后对这四个部分重复上述操作直至不能进行划分及只有一个方格。

代码


#include<bits/stdc++.h>
using namespace std;
//从左上角(a,b)开始处理大小为n×n的迷宫,(x,y)为公主或者已覆盖的位置
void fun(int x,int y,int a,int b,int n){
	if(n==1) return;
         n=n/2;
	if(x<=a+n-1&&y<=b+n-1){//公主或者已覆盖的位置在左上角,使用1号地毯
		cout<<a+n<<" "<<a+n<<" "<<1<<endl;
		fun(x,y,a,b,n);
		fun(a+n-1,b+n,a,b+n,n);
		fun(a+n,b+n-1,a+n,b,n);
		fun(a+n,b+n,a+n,b+n,n); 
	}
	else if(x<=a+n-1&&y>b+n-1){//公主或者已覆盖的位置在左上角,使用2号地毯
		cout<<a+n<<" "<<b+n-1<<" "<<2<<endl;
		fun(a+n-1,b+n-1,a,b,n);
		fun(x,y,a,b+n,n);
		fun(a+n,b+n-1,a+n,b,n);
		fun(a+n,b+n,a+n,b+n,n); 
	}
	else  if(x>a+n-1&&y<=b+n-1){//公主或者已覆盖的位置在左上角,使用3号地毯
		cout<<a+n-1<<" "<<b+n<<" "<<3<<endl;
		fun(a+n-1,b+n-1,a,b,n);
		fun(a+n-1,b+n,a,b+n,n);
		fun(x,y,a+n,b,n);
		fun(a+n,b+n,a+n,b+n,n); 
	}
	else{//公主或者已覆盖的位置在左上角,使用4号地毯
		cout<<a+n-1<<" "<<b+n-1<<" "<<4<<endl;
		fun(a+n-1,b+n-1,a,b,n);
		fun(a+n-1,b+n,a,b+n,n);
		fun(a+n,b+n-1,a+n,b,n);
		fun(x,y,a+n,b+n,n); 
	}
}
int main(){
	int x,y,k;
	cin>>k>>x>>y;
	int n=1<<k;
	fun(x,y,1,1,n);
}

标签:索菲亚,填充,--,题解,T265119,int,划分,方格,砖块
From: https://www.cnblogs.com/zssb/p/16584984.html

相关文章

  • 记录image.width ,grfximage.visibleclipbounds.width 的值分别是多少?
    1usingSystem;2usingSystem.Collections.Generic;3usingSystem.Linq;4usingSystem.Text;5usingSystem.Drawing;6usingSystem.Windows.Forms;7u......
  • [NOIP2001 提高组] 一元三次方程求解
    #include<bits/stdc++.h>usingnamespacestd;intmain(){ doublea,b,c,d,x1,x2,x3; scanf("%lf%lf%lf%lf",&a,&b,&c,&d); for(doublei=-100;i<=100;i+=0.001)//枚举每个......
  • 基于C++的OpenGL 09 之材质
    1.引言本文基于C++语言,描述OpenGL的材质前置知识可参考:基于C++的OpenGL08之基础光照-当时明月在曾照彩云归-博客园(cnblogs.com)笔者这里不过多描述每个名词......
  • hadoop入门之虚拟机安装
    今天按照黑马的视频和课程资料安装了三台Centos的linux虚拟机,步骤非常简单但是视频提示会有很多踩坑的点,我就比较顺利从VMware安装到激活,网络的配置以及虚拟机的安装都非常......
  • 笔记 【使用事件】制作3D自动开关门(附:3D人物移动和旋转,out输出参数,3D搭建使用的快捷
    【仍在施工ing】小Joe视频链接传送门使用事件制作3D自动开关门(附:3D人物移动和旋转,out输出参数,3D搭建使用的快捷键和Packages,泛型委托Action等)上期视频上期笔记思考i......
  • P1008 [NOIP1998 普及组] 三连击
    #include<bits/stdc++.h>usingnamespacestd;intmain(){ for(inta=123,b,c;a<=329;a++) { b=2*a;c=3*a; if((a%10)*(a/10%10)*(a/100)*(b%10)*(b/10%10)*(b/100)*(c%1......
  • vue 父子组件传值方法总结
    1、父组件向子组件传参:(1)父组件直接绑定在子组件的标签上,子组件通过props接收传递过来的参数。(2)父组件主动获取所有的参数和方法this.$refs.childrenName.(参数或方法名)......
  • 一句话读懂宽字节注入
    宽字节注入对于从事安全行业的人来说,提起宽字节,不得不提起宽字节注入。宽字节是由两个字节组成的。前置知识0x27是GBK编码中的单引号“’”0x5C是GBK编码中的反斜杠“......
  • NepCTF2022复现
    Misc花花画画画花花一开始做的时候没想到这个osz文件是个游戏,要用osu打开,导致走了许多弯路,后来看题解之后才知道,osu!是个音游,还挺好玩的,但要是想玩过关,不得不说难度有点......
  • 红黑树以及JAVA实现(一)
    目录前言一、B树1.1概念1.22-3-4树1.32-3-4树的插入节点分类1.42-3-4树的删除1.4.1当删除节点是叶子节点1.4.1.1当删除节点为非2节点1.4.1.2当删除节点为2节点1.4.......