Good morning.everyone.Yesterday i said today i will give you some harder problems solved by divide and conquer.And here it is,The Board covering problem.The code is wrote by myself,and it is not simple enough.So if you can simplify it,please share with me.
Have fun coding,i_human.Have fun coding,everyone!
THE CODE:
#include "stdafx.h"
#include<iostream>
#define a1 1000
int z=1;
int a[a1][a1];
using namespace std;
void cover(int m,int n,int o,int p,int x,int y);
int main()
{
int k;
int i,j;
int l=1;
cin>>k>>i>>j;
a[i][j]=0;
for(int l1=0;l1<k;l1++)
l=l*2;
cover(0,l-1,0,l-1,i,j);
for(int i1=0;i1<l;i1++)
{
for(int i2=0;i2<l;i2++)
cout<<a[i1][i2]<<" ";
cout<<endl;
}
system("pause");
return 0;
}
void cover(int m,int n,int o,int p,int x,int y)
{
if(n-m==1 && p-o==1)
{
int c=a[x][y];
a[m][o]=a[m][p]=a[n][o]=a[n][p]=z;
z++;
a[x][y]=c;
}
else
{
if(x<=(m+n)/2 && y<=(o+p)/2)
{
a[(m+n)/2][(o+p)/2+1]=a[(m+n)/2+1][(o+p)/2]=a[(m+n)/2+1][(o+p)/2+1]=z;
z++;
cover(m,(m+n)/2,o,(o+p)/2,x,y);
cover(m,(m+n)/2,(o+p)/2+1,p,(m+n)/2,(o+p)/2+1);
cover((m+n)/2+1,n,o,(o+p)/2,(m+n)/2+1,(o+p)/2);
cover((m+n)/2+1,n,(o+p)/2+1,p,(m+n)/2+1,(o+p)/2+1);
}
if(x<=(m+n)/2 && y>(o+p)/2)
{
a[(m+n)/2][(o+p)/2]=a[(m+n)/2+1][(o+p)/2]=a[(m+n)/2+1][(o+p)/2+1]=z;
z++;
cover(m,(m+n)/2,o,(o+p)/2,x,y);
cover(m,(m+n)/2,o,(o+p)/2,(m+n)/2,(o+p)/2);
cover((m+n)/2+1,n,o,(o+p)/2,(m+n)/2+1,(o+p)/2);
cover((m+n)/2+1,n,(o+p)/2+1,p,(m+n)/2+1,(o+p)/2+1);
}
if(x>(m+n)/2 && y>(o+p)/2)
{
a[(m+n)/2][(o+p)/2]=a[(m+n)/2+1][(o+p)/2]=a[(m+n)/2][(o+p)/2+1]=z;
z++;
cover(m,(m+n)/2,o,(o+p)/2,x,y);
cover(m,(m+n)/2,o,(o+p)/2,(m+n)/2,(o+p)/2);
cover((m+n)/2+1,n,o,(o+p)/2,(m+n)/2+1,(o+p)/2);
cover(m,(m+n)/2,(o+p)/2+1,p,(m+n)/2,(o+p)/2+1);
}
if(x>(m+n)/2 && y<=(o+p)/2)
{
a[(m+n)/2][(o+p)/2]=a[(m+n)/2+1][(o+p)/2+1]=a[(m+n)/2][(o+p)/2+1]=z;
z++;
cover(m,(m+n)/2,o,(o+p)/2,x,y);
cover(m,(m+n)/2,o,(o+p)/2,(m+n)/2,(o+p)/2);
cover((m+n)/2+1,n,(o+p)/2+1,p,(m+n)/2+1,(o+p)/2+1);
cover(m,(m+n)/2,(o+p)/2+1,p,(m+n)/2,(o+p)/2+1);
}
}
}