#include <iostream>
#include <vector>
using namespace std;
#define N 8
//possible moves
int rowMove[] = {2,1,-1,-2,-2,-1,1,2};
int colMove[] = {1,2,2,1,-1,-2,-2,-1};
void printBoard(const vector<vector<int>> &visited)
{
for(int i=0; i<N; i++)
{
for(int j=0;j<N;j++)
cout<<visited[i][j]<<" ";
cout<<endl;
}
cout<<endl;
}
//check if the given move is valid
bool isValid(const vector<vector<int>> &visited,int row, int col)
{
return (row>=0 && row<N && col>=0 && col<N && visited[row][col]==0);
}
bool solveKnight(vector<vector<int>> &visited,int row, int col,int move)
{
//printBoard(visited);
if(move==N*N)
{
printBoard(visited);
return true;
}
else
{
for(int i=0;i<8;i++)
{
int newRow = row + rowMove[i];
int newCol = col + colMove[i];
if(isValid(visited,newRow,newCol))
{
move++;
visited[newRow][newCol] = move;
if(solveKnight(visited,newRow,newCol,move))
return true;
move--;
visited[newRow][newCol]=0;
}
}
}
return false;
}
int main()
{
vector<vector<int>> visited(N,vector<int>(N,0));
visited[0][0]=1;
if(!solveKnight(visited,0,0,1))
cout<<"not possible";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwojZGVmaW5lIE4gOAogCi8vcG9zc2libGUgbW92ZXMKaW50IHJvd01vdmVbXSA9IHsyLDEsLTEsLTIsLTIsLTEsMSwyfTsKaW50IGNvbE1vdmVbXSA9IHsxLDIsMiwxLC0xLC0yLC0yLC0xfTsKIAogCnZvaWQgcHJpbnRCb2FyZChjb25zdCB2ZWN0b3I8dmVjdG9yPGludD4+ICZ2aXNpdGVkKQp7CiAgICBmb3IoaW50IGk9MDsgaTxOOyBpKyspCiAgICB7CiAgICAgICAgZm9yKGludCBqPTA7ajxOO2orKykKICAgICAgICAgICAgY291dDw8dmlzaXRlZFtpXVtqXTw8IiAiOwogICAgICAgIGNvdXQ8PGVuZGw7CiAgICB9CiAgICBjb3V0PDxlbmRsOwp9CiAKLy9jaGVjayBpZiB0aGUgZ2l2ZW4gbW92ZSBpcyB2YWxpZApib29sIGlzVmFsaWQoY29uc3QgdmVjdG9yPHZlY3RvcjxpbnQ+PiAmdmlzaXRlZCxpbnQgcm93LCBpbnQgY29sKQp7CiAgICByZXR1cm4gKHJvdz49MCAmJiByb3c8TiAmJiBjb2w+PTAgJiYgY29sPE4gJiYgdmlzaXRlZFtyb3ddW2NvbF09PTApOwp9CiAKIApib29sIHNvbHZlS25pZ2h0KHZlY3Rvcjx2ZWN0b3I8aW50Pj4gJnZpc2l0ZWQsaW50IHJvdywgaW50IGNvbCxpbnQgbW92ZSkKewogICAgLy9wcmludEJvYXJkKHZpc2l0ZWQpOwogICAgaWYobW92ZT09TipOKQogICAgewogICAgICAgIHByaW50Qm9hcmQodmlzaXRlZCk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAKICAgIGVsc2UKICAgIHsKICAgICAgICBmb3IoaW50IGk9MDtpPDg7aSsrKQogICAgICAgIHsKICAgICAgICAgICAgaW50IG5ld1JvdyA9IHJvdyArIHJvd01vdmVbaV07CiAgICAgICAgICAgIGludCBuZXdDb2wgPSBjb2wgKyBjb2xNb3ZlW2ldOwogCiAgICAgICAgICAgIGlmKGlzVmFsaWQodmlzaXRlZCxuZXdSb3csbmV3Q29sKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbW92ZSsrOwogICAgICAgICAgICAgICAgdmlzaXRlZFtuZXdSb3ddW25ld0NvbF0gPSBtb3ZlOwogICAgICAgICAgICAgICAgaWYoc29sdmVLbmlnaHQodmlzaXRlZCxuZXdSb3csbmV3Q29sLG1vdmUpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgbW92ZS0tOwogICAgICAgICAgICAgICAgdmlzaXRlZFtuZXdSb3ddW25ld0NvbF09MDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKfQogCiAKaW50IG1haW4oKQp7CiAgICB2ZWN0b3I8dmVjdG9yPGludD4+IHZpc2l0ZWQoTix2ZWN0b3I8aW50PihOLDApKTsKICAgIHZpc2l0ZWRbMF1bMF09MTsKICAgIGlmKCFzb2x2ZUtuaWdodCh2aXNpdGVkLDAsMCwxKSkKICAgICAgICBjb3V0PDwibm90IHBvc3NpYmxlIjsKICAgIHJldHVybiAwOwp9CiA=