分治算法--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
原创粉丝点击