P1228 地毯填补问题(分治)

题目描述

相传在一个古老的阿拉伯国家里,有一座宫殿。宫殿里有个四四方方的格子迷宫,国王选择驸马的方法非常特殊,也非常简单:公主就站在其中一个方格子上,只要谁能用地毯将除公主站立的地方外的所有地方盖上,美丽漂亮聪慧的公主就是他的人了。公主这一个方格不能用地毯盖住,毯子的形状有所规定,只能有四种选择(如图4-l):

并且每一方格只能用一层地毯,迷宫的大小为(2k)^2的方形。当然,也不能让公主无限制的在那儿等,对吧?由于你使用的是计算机,所以实现时间为1s。

输入输出格式

输入格式:

输入文件共2行。

第一行:k,即给定被填补迷宫的大小为2^k(0<k≤10);

第二行:x y,即给出公主所在方格的坐标(x为行坐标,y为列坐标),x和y之间有一个空格隔开。

输出格式:

将迷宫填补完整的方案:每一补(行)为x y c (x,y为毯子拐角的行坐标和列坐标,c为使用毯子的形状,具体见上面的图1,毯子形状分别用1、2、3、4表示,x、y、c之间用一个空格隔开)。

输入输出样例

输入样例#1: 复制

3
3 3
输出样例#1: 复制

5 5 1
2 2 4
1 1 4
1 4 3
4 1 2
4 4 1
2 7 3
1 5 4
1 8 3
3 6 3
4 8 1
7 2 2
5 1 4
6 3 2
8 1 2
8 4 1
7 7 1
6 6 1
5 8 3
8 5 2
8 8 1

说明

事实上感觉四个的形状分别是这样(仅供参考,如果有问题联系icy)

spj报错:

1:c 越界

2:x,y 越界

3:mp[x][y] 已被占用

4:mp[x][y] 从未被使用

题解:

初看这个问题,似乎无从下手,于是我们可以先考虑最简单的情况,既n = 2时

0 0 0 1 这时,无论公主在哪个格子,我们都可以用一块毯子填满

继续考虑n = 4的情况

我们已经知道了解决2 * 2的格子中有一个障碍的情况如何解决,因此我们可以尝试构造这种情况

首先,显然可以将4 4的盘面划分成4个2 2的小盘面,其中一块已经存在一个障碍了

而我们只需在正中间的2 * 2方格中放入一块地毯,就可以使所有小盘面都有一个障碍

于是,n = 4的情况就解决了

我们可以将n = 4时的解法可以推广到一般情况,既当n = 2 k时,我们均可以将问题划分为4个n = 2 k – 1的子问题,然后分治解决即可。

下面附上代码(算法:分治):

 #include<cstdio>
typedef long long ll;
ll x,y,len; int k;
ll fun(int k)
{
ll sum=;
for(int i=;i<=k;++i) sum*=;
return sum;
}
void solve(ll x,ll y,ll a,ll b,ll l)
{
if(l==) return;
if(x-a<=l/- && y-b<=l/-)
{
printf("%lld %lld 1\n",a+l/,b+l/);
solve(x,y,a,b,l/);
solve(a+l/-,b+l/,a,b+l/,l/);
solve(a+l/,b+l/-,a+l/,b,l/);
solve(a+l/,b+l/,a+l/,b+l/,l/);
}
else if(x-a<=l/- && y-b>l/-)
{
printf("%lld %lld 2\n",a+l/,b+l/-);
solve(a+l/-,b+l/-,a,b,l/);
solve(x,y,a,b+l/,l/);
solve(a+l/,b+l/-,a+l/,b,l/);
solve(a+l/,b+l/,a+l/,b+l/,l/);
}
else if(x-a>l/- && y-b<=l/-)
{
printf("%lld %lld 3\n",a+l/-,b+l/);
solve(a+l/-,b+l/-,a,b,l/);
solve(a+l/-,b+l/,a,b+l/,l/);
solve(x,y,a+l/,b,l/);
solve(a+l/,b+l/,a+l/,b+l/,l/);
}
else
{
printf("%lld %lld 4\n",a+l/-,b+l/-);
solve(a+l/-,b+l/-,a,b,l/);
solve(a+l/-,b+l/,a,b+l/,l/);
solve(a+l/,b+l/-,a+l/,b,l/);
solve(x,y,a+l/,b+l/,l/);
}
}
int main()
{
scanf("%d %lld %lld",&k,&x,&y);
len=fun(k);
solve(x,y,,,len);
return ;
}

P1228 地毯填补问题(分治)的更多相关文章

  1. 洛谷P1228 地毯填补问题

    P1228 地毯填补问题 题目描述 相传在一个古老的阿拉伯国家里,有一座宫殿.宫殿里有个四四方方的格子迷宫,国王选择驸马的方法非常特殊,也非常简单:公主就站在其中一个方格子上,只要谁能用地毯将除公主站 ...

  2. 浅谈分治 —— 洛谷P1228 地毯填补问题 题解

    如果想看原题网址的话请点击这里:地毯填补问题 原题: 题目描述 相传在一个古老的阿拉伯国家里,有一座宫殿.宫殿里有个四四方方的格子迷宫,国王选择驸马的方法非常特殊,也非常简单:公主就站在其中一个方格子 ...

  3. [洛谷P1228]地毯填补问题 题解(分治)

    Description 相传在一个古老的阿拉伯国家里,有一座宫殿.宫殿里有个四四方方的格子迷宫,国王选择驸马的方法非常特殊,也非常简单:公主就站在其中一个方格子上,只要谁能用地毯将除公主站立的地方外的 ...

  4. AOJ.859 地毯填补问题 (递归与分治)

    AOJ.859 地毯填补问题 (递归与分治) 题意分析 学习分治思想,第一次接触, 代码总览 #include <iostream> #include <cstdio> #in ...

  5. 洛谷 P1228 【地毯填补问题】

    事实上感觉四个的形状分别是这样: spj报错: 1:c 越界 2:x,y 越界 3:mp[x][y] 已被占用 4:mp[x][y] 从未被使用 题解: 初看这个问题,似乎无从下手,于是我们可以先考虑 ...

  6. 洛谷P1228 分治

    https://www.luogu.org/problemnew/show/P1228 我真傻,真的,我单知道这种题目可以用dfs剪枝过,没有想到还能构造分治,当我敲了一发dfs上去的时候,只看到一个 ...

  7. [bzoj2152][聪聪和可可] (点分治+概率)

    Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好 ...

  8. POJ 2965. The Pilots Brothers' refrigerator 枚举or爆搜or分治

    The Pilots Brothers' refrigerator Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22286 ...

  9. [poj1741][tree] (树/点分治)

    Description Give a tree with n vertices,each edge has a length(positive integer less than 1001). Def ...

随机推荐

  1. Angular——tab切换案例

    基本介绍 angular框架下的tab切换,相比较于之前的纯js写的代码,有一个很大的特点就是以数据为驱动,基本上不用搜索dom元素就可以实现效果 基本使用 (1)导航部分使用的是的状态使用的是ng- ...

  2. servlet-响应的定时刷新

    package servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.ser ...

  3. Lazarus Reading XML- with TXMLDocument and TXPathVariable

    也就是使用XPath的方式,具体语法规则查看http://www.w3school.com.cn/xpath/xpath_syntax.asp,说明得相当详细.这里列举例子是说明在Lazarus/FP ...

  4. js弹开页面并调用方法

    每次重新写一个功能的时候,都能发现以前写的并不太好,都可以改进,奇怪的是我还是我,为什么曾经的我就想不起来要这么写,比如下面两段代码 历史代码: if (infoTablePage != null) ...

  5. IntelliJ IDEA之windows下载安装、卸载

    系统要求 系统支持:Microsoft Windows 8 / 7 / Vista / 2003 / XP(每个系统版本的 32 位和 64 位都可以) JDK 版本:Oracle JDK 1.6 或 ...

  6. 创建pod索引库(Specs)

    专门用来存放xxx.podspec 的索引文件的库就叫做索引库.我们需要将这些索引文件上传到远程索引库才能保证其他的人能够拿来用. 创建一个远程索引库和本地索引库对应起来,步骤如下: 1.登录开源中国 ...

  7. for循环中索引值和取值的迷惑

    利用for循环和range从100——10,倒序讲所有的偶数添加到一个新列表中,然后对列表的元素进行筛选,将能被4整除的数留下来. even = []for i in range(100,9,-1): ...

  8. OprenCV学习之路一:将彩色图片转换成灰度图

    //将一张彩色图片转成灰度图: //////////////////////////// #include<cv.h> #include<cvaux.h> #include&l ...

  9. MarkDown 语法及使用

    MarkDown #什么是Markdown - 定义 - markdown 是一款轻量级标记语言,功能没有HTML标记语言那么强大 ,Markdown专注书写! #试用人群: 程序员/等计算机爱好者 ...

  10. c# 异步执行

    c#异步执行 Action logAction = () => {////执行的操作 }; logAction.BeginInvoke(null, null);