分治算法--L型骨牌棋盘覆盖
来源:互联网 发布:跳跃网络 徐智阳 电话 编辑:程序博客网 时间:2024/05/10 17:12
L型骨牌棋盘覆盖
题目描述
有一个棋盘,要求用给定的四种骨牌进行覆盖。四种骨牌定义如下:
给定的棋盘中有一个格子不存在,即不需要覆盖的格子。
输入
输入有多个用例,第一个为用例个数n,接下来每个用例占两行,其中第一行为棋盘大小(如3,表示棋盘大小为2的3次,即8行8列),第二行为两个正整数,表示空缺的格子行号和列号。
输出
每个用例用一行输出各种骨牌的使用数,用一个空格隔开。
样例输入
1
3
1 1
样例输出
9 5 5 2
如图:
1、先判断缺的瓷砖在整个棋盘的那个位置(左上,右上,左下,右下),缺的瓷砖在1号。
2、在中间放一个对应1号瓷砖。
3、在将再将左上的部分分解,重复直到只有一个瓷砖。
ACcode:
#include <iostream>#include <cmath>using namespace std;int k1,k2,k3,k4;void work(int rs,int re,int cs,int ce, int u,int w){ if(rs==re) return; int rm = (rs+re)/2; int cm = (cs+ce)/2; if(u<=rm)//处在上部分 { if(w<=cm)//处在左部分 { k1++; work(rs,rm,cs,cm,u,w); work(rs,rm,cm+1,ce,rm,cm+1); work(rm+1,re,cs,cm,rm+1,cm); work(rm+1,re,cm+1,ce,rm+1,cm+1); }else //处于右部分 { k2++; work(rs,rm,cs,cm,rm,cm); work(rs,rm,cm+1,ce,u,w); work(rm+1,re,cs,cm,rm+1,cm); work(rm+1,re,cm+1,ce,rm+1,cm+1); } }else //下面 { if(w<=cm)//处在左部分 { k3++; work(rs,rm,cs,cm,rm,cm); work(rs,rm,cm+1,ce,rm,cm+1); work(rm+1,re,cs,cm,u,w); work(rm+1,re,cm+1,ce,rm+1,cm+1); }else { k4++; work(rs,rm,cs,cm,rm,cm); work(rs,rm,cm+1,ce,rm,cm+1); work(rm+1,re,cs,cm,rm+1,cm); work(rm+1,re,cm+1,ce,u,w); } }}int main(){int t,n,u,w;cin>>t;while(t--){k1=k2=k3=k4=0;cin>>n>>u>>w;//u,w表示缺的位置n = (int)pow(2,n); work(1,n,1,n,u,w);cout<<k1<<" "<<k2<<" "<<k3<<" "<<k4<<endl;}return 0;}
0 0
- 分治算法--L型骨牌棋盘覆盖
- L型骨牌棋盘覆盖
- 分治算法;骨牌覆盖棋盘问题;
- 计算机算法设计与分析作业01:分治法求解大数乘法+L型骨牌的棋盘覆盖问题
- 分治算法--棋盘覆盖
- 分治算法---棋盘覆盖
- 棋盘覆盖(分治算法)
- 棋盘覆盖2(1X2骨牌 和 L型骨牌 混合铺满)(强行轮廓线DP)
- js算法:分治法-棋盘覆盖
- 算法系列(一):分治策略--棋盘覆盖
- 分治算法——棋盘覆盖
- 棋盘覆盖递归与分治算法
- 棋盘覆盖(分治-递归)
- 分治法,棋盘覆盖
- 棋盘覆盖问题【分治】
- 棋盘覆盖-分治
- 分治法:棋盘覆盖
- 分治-棋盘覆盖问题
- java 执行sql的两种方法
- 【杂题】fish
- Cocoa编程之IBAction和IBOutlet含义
- Mac OS 的属性列表文件plist装换
- NSNumber一些示例代码
- 分治算法--L型骨牌棋盘覆盖
- javascript foreach用法
- C++之文件IO操作流
- git 关于merge rebase(衍合)
- java连接mysql 数据库方式
- javascript 事件与伪协议
- 从稀疏表示到低秩表示(一)
- NYOJ 字母小游戏 273(gets与scanf区别)
- 算菜价 2090 (好邪乎的一道题,没有输出)