#include <iostream>
using namespace std;
typedef unsigned long long int UI;
#define ID(I,J) (((I)<<3)+(J))
#define NR 8
template <UI STACK,UI I,UI J>struct SetIJ{static const UI VAL=STACK|(UI(1)<<ID(I,J));};
template <UI STACK,UI I,UI J>struct CheckIJ{static const bool VAL=STACK&(UI(1)<<ID(I,J));};
template <UI STACK,UI I,UI J>struct CheckUp{static const bool OK=!CheckIJ<STACK,I-1,J>::VAL && CheckUp<STACK,I-1,J>::OK;};
template <UI STACK,UI J>struct CheckUp<STACK,0,J>{static const bool OK=true;};
template <UI STACK,UI I,UI J>struct CheckLeft{static const bool OK=!CheckIJ<STACK,I-1,J-1>::VAL && CheckLeft<STACK,I-1,J-1>::OK;};
template <UI STACK,UI J>struct CheckLeft<STACK,0,J>{static const bool OK=true;};
template <UI STACK,UI I>struct CheckLeft<STACK,I,0>{static const bool OK=true;};
template <UI STACK>struct CheckLeft<STACK,0,0>{static const bool OK=true;};
template <UI STACK,UI I,UI J>struct CheckRight{static const bool OK=!CheckIJ<STACK,I-1,J+1>::VAL && CheckRight<STACK,I-1,J+1>::OK;};
template <UI STACK,UI J>struct CheckRight<STACK,0,J>{static const bool OK=true;};
template <UI STACK,UI I>struct CheckRight<STACK,I,NR-1>{static const bool OK=true;};
template <UI STACK>struct CheckRight<STACK,0,NR-1>{static const bool OK=true;};
template <UI STACK,UI I,UI J,bool OK>struct Loop{
static const UI SETVAL=SetIJ<STACK,I,J>::VAL;
static void print()
{Loop<SETVAL,I+1,0,CheckUp<SETVAL,I,J>::OK&&CheckLeft<SETVAL,I,J>::OK&&CheckRight<SETVAL,I,J>::OK>::print();
Loop<STACK,I,J+1,true>::print();}
};
template <UI STACK,UI I,UI J>struct Loop<STACK,I,J,false>{static void print(){}};
template <UI STACK,UI I>struct Loop<STACK,I,NR,true>{static void print(){}};
template <UI STACK>struct Loop<STACK,NR,0,true>{
static void print()
{std::cout << std::endl << std::endl;
for(int a=0;a<8;a++)
{for(int b=0;b<8;b++)
std::cout << ((STACK&(UI(1)<<ID(a,b))) ? 1 : 0) << " ";
std::cout << std::endl;}}
};
int main(){Loop<0,0,0,true>::print();}
05-24