دوستان من سورس این برنامه رو پیدا کردم . ولی الگوریتمشو متوجه نمیشم . اگه میشه منو راهنمایی کنید . . ممنون میشم اگه جواب بدید.
Code:
#include <iostream>
#include <conio.h>
using namespace std;
int N;
void cal(char**,int,int,int,int,int);
void display(char**,int);
int main()
{
char **a;
int i,j,n,x,y,x1,y1,temp;
float s1,s2;
cout<<"Enter Size of your map :";
cin>>n;
temp=N=n;
while (n!=2)
{
if (n%2)
{
cout<<"We cant hace such a size (size must be power of 2)!\n";
system("pause");
exit(0);
}
n/=2;
}
cout<<"Enter the empty place:\n";
cout<<"X:";
cin>>x;
cout<<"Y:";
cin>>y;
a=new char* [N];
for (i=0 ; i<N ; i++)
a[i]=new char [N];
for (i=0 ; i<N ; i++)
for (j=0 ; j<N ; j++)
a[i][j]='?';
a[x][y]=' ';
x1=y1=0;
while ( temp != 1)
{
cal(a,temp,x1,y1,x,y);
if ( x < (s1=(float)(x1+x1+temp-1)/2) && y < (s2=(float)(y1+y1+temp-1)/2) )//area 1
{
x1=x1;//baraye neshan dadane raveshe kar ast vagarne ehtiaji be neveshtan nadasht
y1=y1;
}
else if ( x < (float)(x1+x1+temp-1)/2 && y > (float)(y1+y1+temp-1)/2 )//area 2
{
x1=x1;
y1=y1+temp/2;
}
else if ( x > (float)(x1+x1+temp-1)/2 && y < (float)(y1+y1+temp-1)/2 )//area 3
{
x1=x1+temp/2;
y1=y1;
}
else//area 4
{
x1=x1+temp/2;
y1=y1+temp/2;
}
temp/=2;
}
cout<<"The final map is :\n";
for (i=0 ; i<N ; i++)
{
for (j=0 ; j<N ; j++)
cout<<a[i][j]<<' ';
cout<<endl;
}
system("pause");
return 0;
}
//*********************
void cal(char **a , int n, int x1 , int y1 , int x , int y)//x1 & y1 : first place
{ //x & y : empty space
if (n == 2)
{
if ( x == x1 && y == y1 )//1
{
a[x1][y1+1]=1;
a[x1+1][y1]=1;
a[x1+1][y1+1]=1;
display(a,N);
return;
}
else if ( x == x1 && y == y1+1 )//2
{
a[x1][y1]=1;
a[x1+1][y1]=1;
a[x1+1][y1+1]=1;
display(a,N);
return;
}
else if ( x == x1+1 && y == y1 )//3
{
a[x1][y1]=1;
a[x1][y1+1]=1;
a[x1+1][y1+1]=1;
display(a,N);
return;
}
else//4
{
a[x1][y1]=1;
a[x1+1][y1]=1;
a[x1][y1+1]=1;
display(a,N);
return;
}
}
else
{
if ( x < (float)(x1+x1+n-1)/2 && y < (float)(y1+y1+n-1)/2 )//1
{
cal(a , n/2 , x1 , y1+n/2 , x1+n/2-1 , y1+n/2);//2->3 x: kamtar y: hamoonja
cal(a , n/2 , x1+n/2 , y1 , x1+n/2 , y1+n/2-1);//3->2 x: hamoonja y: bishtar
cal(a , n/2 , x1+n/2 , y1+n/2 , x1+n/2 , y1+n/2);//4->1 x: hamoonja y:hamoonja
cal(a , n/2 , x1+n/4 , y1+n/4 , x1+n/4 , y1+n/4);//vasat->khodesh
}
else if ( x < (float)(x1+x1+n-1)/2 && y > (float)(y1+y1+n-1)/2 )//2
{
cal(a , n/2 , x1 , y1 , x1+n/2-1 , y1+n/2-1);//1 x:ham x ham y bishtar
cal(a , n/2 , x1+n/2 , y1 , x1+n/2 , y1+n/2-1);//3
cal(a , n/2 , x1+n/2 , y1+n/2 , x1+n/2 , y1+n/2);//4
cal(a , n/2 , x1+n/4 , y1+n/4 , x1+n/4 , y1+n/4+n/2-1);//vasat
}
else if ( x > (float)(x1+x1+n-1)/2 && y < (float)(y1+y1+n-1)/2 )//3
{
cal(a , n/2 , x1 , y1 , x1+n/2-1 , y1+n/2-1);//1
cal(a , n/2 , x1 , y1+n/2 , x1+n/2-1 , y1+n/2);//2
cal(a , n/2 , x1+n/2 , y1+n/2 , x1+n/2 , y1+n/2);//4
cal(a , n/2 , x1+n/4 , y1+n/4 , x1+n/4+n/2-1 ,y1+n/4);//vasat
}
else
{
cal(a , n/2 , x1 , y1 , x1+n/2-1 , y1+n/2-1);//1
cal(a , n/2 , x1 , y1+n/2 , x1+n/2-1 , y1+n/2);//2
cal(a , n/2 , x1+n/2 , y1 , x1+n/2 , y1+n/2-1);//3
cal(a , n/2 , x1+n/4 , y1+n/4 , x1+n/4+n/2-1 , y1+n/4+n/2-1);//vasat
}
}
}
//*************************
void display(char **a,int ssf)
{
for (int i=0 ; i<ssf ; i++)
{
for (int j=0 ; j<ssf ; j++)
cout<<a[i][j]<<' ';
cout<<endl;
}
cout<<"\nPress any key to see next step...\n";
getch();
system("cls");
}
//**************************