真的好难
L型骨牌棋盘覆盖题目描述
有一个棋盘,要求用给定的四种骨牌进行覆盖。四种骨牌定义如下:
给定的棋盘中有一个格子不存在,即不需要覆盖的格子。
输入
输入有多个用例,第一个为用例个数n,接下来每个用例占两行,其中第一行为棋盘大小(如3,表示棋盘大小为2的3次,即8行8列),第二行为两个正整数,表示空缺的格子行号和列号。
输出
每个用例用一行输出各种骨牌的使用数,用一个空格隔开。
样例输入
1
3
1 1
样例输出
9 5 5 2
#include <iostream>
#include <math.h>
using namespace std;
int h1=0,h2=0,h3=0,h4=0;
int a[100][100];
void func(int sr,int sl,int er,int el,int r,int l)
{
int mr,ml;
if(er==sr)
return ;
mr = (er+sr)/2;
ml = (el+sl)/2;
//缺的属于哪一部分
if(r<=mr) //上半部分
{
if(l<=ml) //左部分
{
// cout<<"放L1"<<endl;
h1++;
a[mr][ml+1] = 1;
a[mr+1][ml] = 1;
a[mr+1][ml+1] = 1;
//递归四次,
func(sr,sl,mr,ml,r,l);
func(sr,mr+1,mr,el,mr,ml+1);
func(ml+1,sl,er,ml,mr+1,ml);
func(mr+1,ml+1,er,el,mr+1,ml+1);
}
else
{
h2++;
// cout<<"放L2"<<endl;
a[mr][ml] = 2;
a[mr+1][ml] = 2;
a[mr+1][ml+1] = 2;
//递归四次,
func(sr,sl,mr,ml,mr,ml);
func(sr,mr+1,mr,el,r,l);
func(ml+1,sl,er,ml,mr+1,ml);
func(mr+1,ml+1,er,el,mr+1,ml+1);
}
}
else
{
if(l<=ml) //左部分
{
h3++;
// cout<<"放L3"<<endl;
a[mr][ml] = 3;
a[mr][ml+1] = 3;
a[mr+1][ml+1] = 3;
//递归四次,
func(sr,sl,mr,ml,mr,ml);
func(sr,mr+1,mr,el,mr,ml+1);
func(ml+1,sl,er,ml,r,l);
func(mr+1,ml+1,er,el,mr+1,ml+1);
}
else
{
h4++;
// cout<<"放L4"<<endl;
a[mr][ml] = 4;
a[mr][ml+1] = 4;
a[mr+1][ml] = 4;
//递归四次,
func(sr,sl,mr,ml,mr,ml);
func(sr,mr+1,mr,el,mr,ml+1);
func(ml+1,sl,er,ml,mr+1,ml);
func(mr+1,ml+1,er,el,r,l);
}
}
}
int main()
{
int n;
int i,j,r,l;
cin>>n;
n = (int)pow(2,n);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
a[i][j] = 0;
}
cin>>r>>l;
cout<<"行数"<<n<<endl;
a[r][l] = 5;
func(1,1,n,n,r,l);
cout<<h1<<' '<<h2<<' '<<h3<<' '<<h4<<endl;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
cout<<a[i][j]<<' ';
cout<<endl;
}
cout<<n<<endl;
return 0;
}
哪错了 找不出来