#include <iostream.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>
#include <windows.h>
#define BOARD_SIZE 32
int board[BOARD_SIZE][BOARD_SIZE]={0};
int val_sign;
int sign(bool change=false)
{
if(change)
{
val_sign++;
if (val_sign==32)
val_sign++;
}
if(val_sign<14 || val_sign>127)
val_sign=14;
return val_sign;
};
void fix(int left, int top, int right, int bottom, int empty_i, int empty_j)
{
int ret_val=0;
int size=right-left+1;
if (size==2)
{
sign(true);
for (int i=left; i<=right; i++)
for(int j=top; j<=bottom; j++)
if (board[i][j]==1)
board[i][j]=sign();
}
else if (size>2)
{
int dir_i=(empty_i-left)/(size/2);
int dir_j=(empty_j-top)/(size/2);
if(dir_i==0 && dir_j==0)
{
board[left+size/2][top+size/2-1]=sign(true);
board[left+size/2-1][top+size/2]=sign();
board[left+size/2][top+size/2]=sign();
fix(left, top, left+size/2 - 1, top+size/2 -1, empty_i, empty_j );
fix(left+size/2, top, right, top+size/2 - 1, left+size/2, top+size/2-1);
fix(left, top+size/2, left+size/2 - 1, bottom, left+size/2 - 1, top+size/2 );
fix(left+size/2, top+size/2, right, bottom, left+size/2, top+size/2);
}
else if (dir_i==1 && dir_j==0)
{
board[left+size/2-1][top+size/2-1]=sign(true);
board[left+size/2-1][top+size/2]=sign();
board[left+size/2][top+size/2]=sign();
fix(left, top, left+size/2 - 1, top+size/2 -1, left+size/2 - 1, top+size/2 - 1);
fix(left+size/2, top, right, top+size/2 - 1, empty_i, empty_j);
fix(left, top+size/2, left+size/2 - 1, bottom, left+size/2 - 1, top+size/2 );
fix(left+size/2, top+size/2, right, bottom, left+size/2, top+size/2);
}
else if (dir_i==0 && dir_j==1)
{
board[left+size/2-1][top+size/2-1]=sign(true);
board[left+size/2][top+size/2-1]=sign();
board[left+size/2][top+size/2]=sign();
fix(left, top, left+size/2 - 1, top+size/2 -1, left+size/2 - 1, top+size/2 - 1);
fix(left+size/2, top, right, top+size/2 - 1, left+size/2, top+size/2 - 1);
fix(left, top+size/2, left+size/2 - 1, bottom, empty_i, empty_j);
fix(left+size/2, top+size/2, right, bottom, left+size/2, top+size/2);
}
else if (dir_i==1 && dir_j==1)
{
board[left+size/2-1][top+size/2-1]=sign(true);
board[left+size/2][top+size/2-1]=sign();
board[left+size/2-1][top+size/2]=sign();
fix(left, top, left+size/2 - 1, top+size/2 -1, left+size/2 - 1, top+size/2 - 1);
fix(left+size/2, top, right, top+size/2 - 1, left+size/2, top+size/2 - 1);
fix(left, top+size/2, left+size/2 - 1, bottom, left+size/2 - 1, top+size/2);
fix(left+size/2, top+size/2, right, bottom, empty_i, empty_j);
}
}
};
void main()
{
srand((unsigned) time(NULL));
for (int i=0; i<BOARD_SIZE; i++)
for(int j=0; j<BOARD_SIZE; j++)
board[i][j]=1;
int random_i=rand()%BOARD_SIZE;
int random_j=rand()%BOARD_SIZE;
board[random_i][random_j]=0;
cout<<"/////////////////////////////////////////////////////////////////////\n";
for (i=0; i<BOARD_SIZE; i++)
{
for(int j=0; j<BOARD_SIZE; j++)
{
cout<<board[i][j]<<' ';
}
cout<<'\n';
}
cout<<"*********************************************************************\n";
fix(0,0,BOARD_SIZE-1,BOARD_SIZE-1,random_i, random_j);
for (i=0; i<BOARD_SIZE; i++)
{
for(int j=0; j<BOARD_SIZE; j++)
{
cout<<(char)board[i][j]<<' ';
}
cout<<'\n';
}
cout<<"/////////////////////////////////////////////////////////////////////\n";
cerr<<"Program will exit in 50 secs...\n";
Sleep(50000);
}