Tromino(更准确地说是“右Trominio”)是一个由棋盘上的三个1x1方块组成的L型骨牌。我们的问题是,如何用Tromino覆盖一个缺少了一个方块(可以在棋盘上的任何位置)的2^n*2^n棋盘。除了这个缺失的方块,Tromino应该覆盖棋盘上的所有方块,Tromino可以任意转向但不能有重叠。为此问题设计一个分治算法。(PS:具体可以参考下图)

  1. 解法:分治思想每次将2^n*2^n的正方形分成四个2^(n-1)*2^(n-1)的正方形,此时缺块一定在其中一个正方形中,在其他三个正方形中各设置一个缺块,缺块组成L行,继续分治,分治得到的正方形边长为2。
#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>using namespace std;int a[50][50];void solve(int x1,int y1,int length,int x,int y,int flag)    {                                                             int i=length/2;               if(i-1==0)  //当棋盘的长度的一半为1时开始解决问题 {   if(x<=x1+i-1&&y>y1+i-1)    //缺块在第一象限   a[x1+i-1][y1+i-1]=a[x1+i][y1+i-1]=a[x1+i][y1+i]=flag++;  //分别为2,3,4  else if(x<=x1+i-1&&y<=y1+i-1)   //缺块在第二象限   a[x1+i-1][y1+i]=a[x1+i][y1+i]=a[x1+i][y1+i-1]=flag++;    //分别为1,4,3    else if(x>x1+i-1&&y<=y1+i-1)    //缺块在第三象限   a[x1+i-1][y1+i-1]=a[x1+i-1][y1+i]=a[x1+i][y1+i]=flag++;  //分别为2,1,4    else   a[x1+i-1][y1+i-1]=a[x1+i-1][y1+i]=a[x1+i][y1+i-1]=flag++;//分别为2,1,3    }   else   {   if(x<=x1+i-1&&y>y1+i-1)   //缺块在第一象限   {      a[x1+i-1][y1+i-1]=a[x1+i][y1+i-1]=a[x1+i][y1+i]=flag++;  //分别为2,3,4 象限靠近棋盘中心点的3个棋盘格置1(组成L型),意为该象限棋盘的缺块   solve(x1,y1+i,i,x,y,flag);             //解第一象限    solve(x1,y1,i,x1+i-1,y1+i-1,flag);       //解第二象限        solve(x1+i,y1,i,x1+i,y1+i-1,flag);         //解第三象限    solve(x1+i,y1+i,i,x1+i,y1+i,flag);           //解第四象限    }   else if(x<=x1+i-1&&y<=y1+i-1)  //缺块在第二象限  {   a[x1+i-1][y1+i]=a[x1+i][y1+i]=a[x1+i][y1+i-1]=flag++;  //分别为1,3,4 象限靠近棋盘中心点的3个棋盘格置1(组成L型),意为该象限棋盘的缺块   solve(x1,y1+i,i,x1+i-1,y1+i,flag);         //解第一象限    solve(x1,y1,i,x,y,flag);           //解第二象限    solve(x1+i,y1,i,x1+i,y1+i-1,flag);         //解第三象限    solve(x1+i,y1+i,i,x1+i,y1+i,flag);           //解第四象限    }   else if(x>x1+i-1&&y<=y1+i-1)  //缺块在第三象限  {   a[x1+i-1][y1+i-1]=a[x1+i-1][y1+i]=a[x1+i][y1+i]=flag++;   solve(x1,y1+i,i,x1+i-1,y1+i,flag);         //解第一象限    solve(x1,y1,i,x1+i-1,y1+i-1,flag);       //解第二象限    solve(x1+i,y1,i,x,y,flag);           //解第三象限    solve(x1+i,y1+i,i,x1+i,y1+i,flag);           //解第四象限    }   else  //缺块在第四象限  {   a[x1+i-1][y1+i-1]=a[x1+i-1][y1+i]=a[x1+i][y1+i-1]=flag++;//分别为2,1,3    solve(x1,y1+i,i,x1+i-1,y1+i,flag);         //解第一象限    solve(x1,y1,i,x1+i-1,y1+i-1,flag);       //解第二象限   solve(x1+i,y1,i,x1+i,y1+i-1,flag);         //解第三象限   solve(x1+i,y1+i,i,x,y,flag);           //解第四象限    }   }   }int main(){int n,x,y;cin>>n;int k=pow(2,n);                        // k 为正方形边长for(int i=1;i<=k;++i){for(int j=1;j<=k;++j){cin>>a[i][j];if(a[i][j]==1){x=i;y=j;}}}cout<<"缺块位置: "<<x<<" "<<y<<endl;solve(1,1,k,x,y,0);                     //调用分治过程for(int i=1;i<=k;++i){for(int j=1;j<=k;++j)cout<<a[i][j]<<" ";cout<<endl;}return 0;}

Tromino(更准确地说是“右Trominio”)是一个由棋盘上的三个1x1方块组成的L型骨牌。相关推荐

  1. CSP 201409-5 拼图问题(给出一个n×m的方格图,现在要用如下L型的积木拼到这个图中......)

    CSP 201409-5 拼图问题 一.题目信息 第一次写博客,有什么疏漏之处,欢迎各位大佬指出<(* ̄▽ ̄*)/ 题目要求 试题编号 201409-5 试题名称 拼图 时间限制 3.0s 试题 ...

  2. android 并排按钮,简单布局:右边三个按钮并排靠右,左边一个输入框填满其他空间,多谢...

    求一个简单布局:右边三个按钮并排靠右,左边一个输入框填满其他空间,谢谢 如我的一行要显示四个控件 TextView1,Button1,Button2,Button3 要求是 Button1,Butto ...

  3. 记录一下一个大专学历大三学生出来找u3d实习工作,这几天的面试经历

    记录一下一个大专学历大三学生出来找u3d实习工作,这几天的面试经历 第一家 第二家 第三家 第四家 第五家 目前是大三出来找实习工作的,分享一下自己最近一星期找工作的经历 我是一名专科生,大学学的是软 ...

  4. Java黑皮书课后题第6章:*6.39(几何:点的位置)编程练习题3.32显示如何测试一个点是否在一个有向直线的左侧、右侧或在直线上,编写一个程序,输入三个点p0p1p2,显示p2是否在直线p0p1

    6.39(几何:点的位置)编程练习题3.32显示如何测试一个点是否在一个有向直线的左侧.右侧或在直线上,编写一个程序,输入三个点p0p1p2,显示p2是否在直线p0p1 题目 题目描述 编程练习题3. ...

  5. 如何使用graphpad做柱形图_系列文章 如何使用PaddleDetection做一个完整项目(三)...

    系列文章 如何使用PaddleDetection做一个完整项目(三) 该文章是PaddleDetection的完结篇,请参考之前两篇文章 https://zhuanlan.zhihu.com/p/10 ...

  6. linux exec 脚本之家,详解Shell脚本中调用另一个Shell脚本的三种方式

    主要以下有几种方式: Command Explanation fork 新开一个子 Shell 执行,子 Shell 可以从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回给父 ...

  7. 1 1 2 3 5 8 java_【Java】一个斐波那契数列是由数字1、1、2、3、5、8、13、21、34等等组成的,其中每一个数字(从第三个数字起)都是前两个数字的和。...

    题目: 一个斐波那契数列是由数字1.1.2.3.5.8.13.21.34等等组成的,其中每一个数字(从第三个数字起)都是前两个数字的和.创建一个方法,接受一个整数参数,并显示从第一个元素开始总共由该参 ...

  8. 考虑一个路由器连接了三个子网--给出前缀要求网络地址的解法

    文字题目为(方便大家搜索): 考虑一个路由器连接了三个子网:子网1,子网2,子网3.假设这些子网中的所有接口都具有前缀223.1.17/24.假设子网1要支持多达60个接口,而子网2要支持多达90接口 ...

  9. 自定义实现一个RPC框架(三)

    文章目录 自定义实现一个RPC框架(三): 地址:https://gitee.com/liyunfengfengfeng/rpc 注册中心 文件实现 Zookeeper实现注册中心 自定义实现一个RP ...

最新文章

  1. ubuntu14.04交叉编译vlc2.1.5源码,编译出在win32下运行的程序
  2. 远程管理卡介绍使用场景
  3. Markdown的常用语法
  4. WordPress菜单“显示选项”无法显示的解决办法
  5. LeetCode 862. 和至少为 K 的最短子数组(前缀和+deque单调栈)
  6. 字段类型 sqoop_数据迁移工具Sqoop
  7. Python二叉树遍历
  8. Mac或者Linux安装RabbitMQ
  9. MATLAB 在图像处理和机器视觉的应用举例01 - 官网培训视频笔记(上)-- 图像分割和图像配准
  10. 处理多维特征的输出(糖尿病数据)
  11. 实战| JSP Servlet Mysql学生信息管理系统
  12. string 都不能作用于switch_谁带孩子争论不休?家庭教育谁也不能缺席,每个人的作用都不同...
  13. 2019.7.5刷题统计
  14. 也玩ASP.NET MVC 与 WebFroms 整合
  15. 小技巧,把execl.exe转换成dll
  16. 2020暨大计算机考研失败经验总结
  17. jquery表单美化组件实例
  18. android logo颜色渐变,2018,很多APP的logo渐变了 -- 渐变色教程
  19. 2018 年 8 月面试路:6 天 21 家公司
  20. 科大讯飞输入法android离线语音,讯飞输入法Android5.0.1752 离线语音更轻快的表达...

热门文章

  1. 腾讯会议发布录屏工具“会记”,让云端视频协作随用随录、随享随看
  2. 万豪环保系列之《紫外线消毒器》
  3. 联通的流量卡都是快递激活吗?快递激活手机卡有没有关系?
  4. 推广网站的26种方法
  5. Python基础(适合初学-完整教程-学习时间一周左右-节约您的时间)
  6. 正确进入Iphone DFU模式
  7. Mac/OSX 系统如何采集扬声器(代码实现 附源码)
  8. 计算机组装配置(之电源选购)
  9. 第五章:3ds max UV展开和BP贴图绘制(下)
  10. 孙武被任命为凯悦与首旅如家合资公司CEO及董事总经理