This is a database project containing all klotski cases.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

319 lines
11 KiB

#include<iostream>
#include<vector>
#include<list>
#include<fstream>
using namespace std;
ofstream File_Output;
vector<unsigned int> Data_All;
unsigned char Data_Num[21],Data_Blocks[12],Data_Direction[6];
unsigned char Space_Num[9],Space_Style[9];
unsigned int u,Address,Result;
bool Found;
void Add(unsigned int Data);
void Output_Data(unsigned int Data){
unsigned char i;
for(i=0;i<8;i++){
if((0xF&Data>>(7-i)*4)==0x0){File_Output<<"0";}
if((0xF&Data>>(7-i)*4)==0x1){File_Output<<"1";}
if((0xF&Data>>(7-i)*4)==0x2){File_Output<<"2";}
if((0xF&Data>>(7-i)*4)==0x3){File_Output<<"3";}
if((0xF&Data>>(7-i)*4)==0x4){File_Output<<"4";}
if((0xF&Data>>(7-i)*4)==0x5){File_Output<<"5";}
if((0xF&Data>>(7-i)*4)==0x6){File_Output<<"6";}
if((0xF&Data>>(7-i)*4)==0x7){File_Output<<"7";}
if((0xF&Data>>(7-i)*4)==0x8){File_Output<<"8";}
if((0xF&Data>>(7-i)*4)==0x9){File_Output<<"9";}
if((0xF&Data>>(7-i)*4)==0xA){File_Output<<"A";}
if((0xF&Data>>(7-i)*4)==0xB){File_Output<<"B";}
if((0xF&Data>>(7-i)*4)==0xC){File_Output<<"C";}
if((0xF&Data>>(7-i)*4)==0xD){File_Output<<"D";}
if((0xF&Data>>(7-i)*4)==0xE){File_Output<<"E";}
if((0xF&Data>>(7-i)*4)==0xF){File_Output<<"F";}
}
}
void Data_cout(unsigned int Data){
unsigned char i;
for(i=0;i<8;i++){
if((0xF&Data>>(7-i)*4)==0x0){cout<<"0";}
if((0xF&Data>>(7-i)*4)==0x1){cout<<"1";}
if((0xF&Data>>(7-i)*4)==0x2){cout<<"2";}
if((0xF&Data>>(7-i)*4)==0x3){cout<<"3";}
if((0xF&Data>>(7-i)*4)==0x4){cout<<"4";}
if((0xF&Data>>(7-i)*4)==0x5){cout<<"5";}
if((0xF&Data>>(7-i)*4)==0x6){cout<<"6";}
if((0xF&Data>>(7-i)*4)==0x7){cout<<"7";}
if((0xF&Data>>(7-i)*4)==0x8){cout<<"8";}
if((0xF&Data>>(7-i)*4)==0x9){cout<<"9";}
if((0xF&Data>>(7-i)*4)==0xA){cout<<"A";}
if((0xF&Data>>(7-i)*4)==0xB){cout<<"B";}
if((0xF&Data>>(7-i)*4)==0xC){cout<<"C";}
if((0xF&Data>>(7-i)*4)==0xD){cout<<"D";}
if((0xF&Data>>(7-i)*4)==0xE){cout<<"E";}
if((0xF&Data>>(7-i)*4)==0xF){cout<<"F";}
}
}
unsigned char Get_Style(unsigned char Num){
if(Num==0){return 0;}
if(Num>=1&&Num<=5){
if(Data_Direction[Num]==0){return 1;}else{return 2;}
}
if(Num>=6&&Num<=9){return 3;}
return 4;
}
void Search_Space(){
unsigned char Num,i=0;
Space_Again:;
if(Data_Blocks[i+10]>4){
Num=Data_Num[Data_Blocks[i+10]-4];
Space_Num[i*4+1]=Num;
Space_Style[i*4+1]=Get_Style(Num);
}
else{
Space_Num[i*4+1]=0;
Space_Style[i*4+1]=4;
}
if(Data_Blocks[i+10]<17){
Num=Data_Num[Data_Blocks[i+10]+4];
Space_Num[i*4+2]=Num;
Space_Style[i*4+2]=Get_Style(Num);
}
else{
Space_Num[i*4+2]=0;
Space_Style[i*4+2]=4;
}
if((Data_Blocks[i+10]%4)!=1){
Num=Data_Num[Data_Blocks[i+10]-1];
Space_Num[i*4+3]=Num;
Space_Style[i*4+3]=Get_Style(Num);
}
else{
Space_Num[i*4+3]=0;
Space_Style[i*4+3]=4;
}
if((Data_Blocks[i+10]%4)!=0){
Num=Data_Num[Data_Blocks[i+10]+1];
Space_Num[i*4+4]=Num;
Space_Style[i*4+4]=Get_Style(Num);
}
else{
Space_Num[i*4+4]=0;
Space_Style[i*4+4]=4;
}
if(i==0){i++;goto Space_Again;}
}
void Analyse(unsigned int Data){
unsigned char Num,Style,i,c,b=1,j=1,k=1;
for(i=1;i<=20;i++){
Data_Num[i]=12;
}
c=Data&0xF;
i=1;
for(Num=1;Num<=20;Num++){
if(Data_Num[Num]==12){
if(c==i){
Data_Num[Num]=0;
Data_Num[Num+1]=0;
Data_Num[Num+4]=0;
Data_Num[Num+5]=0;
Data_Blocks[0]=Num;
c=0;
goto Again;
}
Style=(Data>>(32-i*2))&3;
i++;
if(Style==0){
Data_Num[Num]=10;
Data_Blocks[k+9]=Num;
k++;
}
if(Style==1){
Data_Num[Num]=j;
Data_Num[Num+1]=j;
Data_Direction[j]=0;
Data_Blocks[j]=Num;
j++;
}
if(Style==2){
Data_Num[Num]=j;
Data_Num[Num+4]=j;
Data_Direction[j]=1;
Data_Blocks[j]=Num;
j++;
}
if(Style==3){
Data_Num[Num]=b+5;
Data_Blocks[b+5]=Num;
b++;
}
Again:;
}
}
Search_Space();
}
unsigned char Direction_Back(unsigned char Way){
if(Way==1){return 2;}
if(Way==2){return 1;}
if(Way==3){return 4;}
if(Way==4){return 3;}
}
void Move_Block(unsigned char Num,unsigned char Direction){
if(Num==0){
Data_Num[Data_Blocks[Num]]=10;
Data_Num[Data_Blocks[Num]+1]=10;
Data_Num[Data_Blocks[Num]+4]=10;
Data_Num[Data_Blocks[Num]+5]=10;
}
if(Num>=1&&Num<=5){
if(Data_Direction[Num]==0){
Data_Num[Data_Blocks[Num]]=10;
Data_Num[Data_Blocks[Num]+1]=10;
}
else{
Data_Num[Data_Blocks[Num]]=10;
Data_Num[Data_Blocks[Num]+4]=10;
}
}
if(Num>=6&&Num<=9){
Data_Num[Data_Blocks[Num]]=10;
}
if(Direction==1)(Data_Blocks[Num]=Data_Blocks[Num]-4);
if(Direction==2)(Data_Blocks[Num]=Data_Blocks[Num]+4);
if(Direction==3)(Data_Blocks[Num]=Data_Blocks[Num]-1);
if(Direction==4)(Data_Blocks[Num]=Data_Blocks[Num]+1);
if(Num==0){
Data_Num[Data_Blocks[Num]]=0;
Data_Num[Data_Blocks[Num]+1]=0;
Data_Num[Data_Blocks[Num]+4]=0;
Data_Num[Data_Blocks[Num]+5]=0;
}
if(Num>=1&&Num<=5){
if(Data_Direction[Num]==0){
Data_Num[Data_Blocks[Num]]=Num;
Data_Num[Data_Blocks[Num]+1]=Num;
}
else{
Data_Num[Data_Blocks[Num]]=Num;
Data_Num[Data_Blocks[Num]+4]=Num;
}
}
if(Num>=6&&Num<=9){
Data_Num[Data_Blocks[Num]]=Num;
}
}
void Create(unsigned char Num,unsigned char Direction_1,unsigned char Direction_2){
unsigned char i,j,n;
unsigned int Data_Output,Space_Address[2];
Move_Block(Num,Direction_1);
Move_Block(Num,Direction_2);
n=0;
for(i=1;i<=20;i++){
if(Data_Num[i]==10){Space_Address[n]=i;n++;}
}
j=0;
Data_Output=0;
for(n=1;n<=20;n++){
for(i=1;i<10;i++){
if(Data_Blocks[i]==n){
if(i<=5){Data_Output=Data_Output|((Data_Direction[i]+1)<<(30-j*2));}
if(i>=6){Data_Output=Data_Output|(3<<(30-j*2));}
j++;
}
}
if(Space_Address[0]==n){Data_Output=Data_Output|(0<<(30-j*2));j++;}
if(Space_Address[1]==n){Data_Output=Data_Output|(0<<(30-j*2));j++;}
if(Data_Blocks[0]==n){Data_Output=Data_Output|(j+1);}
}
Add(Data_Output);
if(Data_Blocks[0]==14){
Result=Data_Output;
Found=true;
}
Move_Block(Num,Direction_Back(Direction_2));
Move_Block(Num,Direction_Back(Direction_1));
}
void Search_Way(unsigned int Data){
Analyse(Data);
if((Data_Blocks[11]-Data_Blocks[10])==1){
if((Space_Style[1]==0)&&(Space_Style[5]==0)){Create(Space_Num[1],2,0);}
if((Space_Style[1]==1)&&(Space_Style[5]==1)){Create(Space_Num[1],2,0);}
if(Space_Style[1]==2){Create(Space_Num[1],2,0);}
if(Space_Style[5]==2){Create(Space_Num[5],2,0);}
if(Space_Style[1]==3){Create(Space_Num[1],2,0);Create(Space_Num[1],2,4);}
if(Space_Style[5]==3){Create(Space_Num[5],2,0);Create(Space_Num[5],2,3);}
if((Space_Style[2]==0)&&(Space_Style[6]==0)){Create(Space_Num[2],1,0);}
if((Space_Style[2]==1)&&(Space_Style[6]==1)){Create(Space_Num[2],1,0);}
if(Space_Style[2]==2){Create(Space_Num[2],1,0);}
if(Space_Style[6]==2){Create(Space_Num[6],1,0);}
if(Space_Style[2]==3){Create(Space_Num[2],1,0);Create(Space_Num[2],1,4);}
if(Space_Style[6]==3){Create(Space_Num[6],1,0);Create(Space_Num[6],1,3);}
if(Space_Style[3]==1){Create(Space_Num[3],4,0);Create(Space_Num[3],4,4);}
if(Space_Style[3]==3){Create(Space_Num[3],4,0);Create(Space_Num[3],4,4);}
if(Space_Style[8]==1){Create(Space_Num[8],3,0);Create(Space_Num[8],3,3);}
if(Space_Style[8]==3){Create(Space_Num[8],3,0);Create(Space_Num[8],3,3);}
}
else if((Data_Blocks[11]-Data_Blocks[10])==4){
if(Space_Style[1]==2){Create(Space_Num[1],2,0);Create(Space_Num[1],2,2);}
if(Space_Style[1]==3){Create(Space_Num[1],2,0);Create(Space_Num[1],2,2);}
if(Space_Style[6]==2){Create(Space_Num[6],1,0);Create(Space_Num[6],1,1);}
if(Space_Style[6]==3){Create(Space_Num[6],1,0);Create(Space_Num[6],1,1);}
if((Space_Style[3]==0)&&(Space_Style[7]==0)){Create(Space_Num[3],4,0);}
if((Space_Style[3]==2)&&(Space_Style[7]==2)){Create(Space_Num[3],4,0);}
if(Space_Style[3]==1){Create(Space_Num[3],4,0);}
if(Space_Style[7]==1){Create(Space_Num[7],4,0);}
if(Space_Style[3]==3){Create(Space_Num[3],4,0);Create(Space_Num[3],4,2);}
if(Space_Style[7]==3){Create(Space_Num[7],4,0);Create(Space_Num[7],4,1);}
if((Space_Style[4]==0)&&(Space_Style[8]==0)){Create(Space_Num[4],3,0);}
if((Space_Style[4]==2)&&(Space_Style[8]==2)){Create(Space_Num[4],3,0);}
if(Space_Style[4]==1){Create(Space_Num[4],3,0);}
if(Space_Style[8]==1){Create(Space_Num[8],3,0);}
if(Space_Style[4]==3){Create(Space_Num[4],3,0);Create(Space_Num[4],3,2);}
if(Space_Style[8]==3){Create(Space_Num[8],3,0);Create(Space_Num[8],3,1);}
}
else{
if(Space_Style[1]==2){Create(Space_Num[1],2,0);}
if(Space_Style[1]==3){Create(Space_Num[1],2,0);}
if(Space_Style[2]==2){Create(Space_Num[2],1,0);}
if(Space_Style[2]==3){Create(Space_Num[2],1,0);}
if(Space_Style[3]==1){Create(Space_Num[3],4,0);}
if(Space_Style[3]==3){Create(Space_Num[3],4,0);}
if(Space_Style[4]==1){Create(Space_Num[4],3,0);}
if(Space_Style[4]==3){Create(Space_Num[4],3,0);}
if(Space_Style[5]==2){Create(Space_Num[5],2,0);}
if(Space_Style[5]==3){Create(Space_Num[5],2,0);}
if(Space_Style[6]==2){Create(Space_Num[6],1,0);}
if(Space_Style[6]==3){Create(Space_Num[6],1,0);}
if(Space_Style[7]==1){Create(Space_Num[7],4,0);}
if(Space_Style[7]==3){Create(Space_Num[7],4,0);}
if(Space_Style[8]==1){Create(Space_Num[8],3,0);}
if(Space_Style[8]==3){Create(Space_Num[8],3,0);}
}
}
void Add(unsigned int Data){
for(u=0;u<Data_All.size();u++){
if(Data_All[u]==Data){goto out;}
}
Data_All.push_back(Data);
out:;
}
void Calculate(unsigned int Data){
unsigned int i;
Data_All.push_back(Data);
File_Output.open("Data.txt");
Address=0;
Found=false;
while(1){
Search_Way(Data_All[Address]);
Address++;
if(Found==true){break;}
}
for(i=0;i<Data_All.size();i++){
Output_Data(Data_All[i]);
File_Output<<endl;
}
File_Output.close();
}
int main(){
unsigned int Start_Data=0xA9BF0C02;
Calculate(Start_Data);
return 0;
}