P.S 风水不好!!!
//八数码问题
#include <iostream>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <algorithm>
#include <stdio.h>
using namespace std;
/*变量声明部分*/
int map[1000][3][3];
int dx[4]={0,-1,0,1};
int dy[4]={-1,0,1,0};
int t,k,father[1000];
/*
int num=0; //总共有几种移动方法变成目标状态
int map[1000][3][3];
int mother;
int dx[4]={0,-1,0,1}; //x 方向移动函数
int dy[4]={-1,0,1,0}; //y 方向移动函数
int t,k,father[1000];
*/
/*函数声明部分*/
void First(void); //初始化函数
void tryy(int t); //深度优先搜索回溯函数
void print(int s); //打印函数
void FindZero(int t,int &i,int &j); //查 0 函数
inline bool compare(); //比较函数
inline void swap(short &sa,short &sb); //交换函数
inline bool Find(int k); //查找函数
inline void move(int k,int i,int j,int x,int y);
//移动函数
/*===========================================================================*/
/*主函数*/
int main() {
First( );
tryy(1);
cout<<num;
system("pause");
return 0;
}
/*===========================================================================*/
/*小型 inline 函数部分*/
inline bool Find(int k) {
bool flag;
for(int i=1;i<k;i++)
{flag=0;
for(int j=0;j<3;j++)
for(int l=0;l<3;l++)
if(map[i][j][l]!=map[k][j][l])
{flag=1;break;}
if (flag==0) return false;
}
return true;
}
inline void swap(short &sa,short &sb)
{short sc=sa;sa=sb;sb=sc; }
inline void move(int k,int i,int j,int x,int y) {
if((0<=x && x<=2)&&(0<=y && y<=2)) //检查是否越界
swap(map[k][i][j],map[k][x][y]);
}
inline bool compare() {
for(int m=0;m<=3;m++)
for(int n=0;n<=3;n++)
if(map[k][m][n]!=map[0][m][n])
return false;
return true;
}
/*===========================================================================*/
/*主要函数部分*/
/* 初始化 */
void First(void) {
/* End */
map[0][0][0]=1; map[0][0][1]=2; map[0][0][2]=3;
map[0][1][0]=8; map[0][1][1]=0; map[0][1][2]=4;
map[0][2][0]=7; map[0][2][1]=6; map[0][2][2]=5;
/* Begin */
map[1][0][0]=2; map[1][0][1]=8; map[1][0][2]=3;
map[1][1][0]=1; map[1][1][1]=6; map[1][1][2]=4;
map[1][2][0]=7; map[1][2][1]=0; map[1][2][2]=5;
t=1;k=2;
}
void tryy(int t) {
int i,j,x,y;
FindZero(t,i,j);
for(int ii=0;ii<=2;ii++)
for(int jj=0;jj<=2;jj++)
map[k][ii][jj]=map[t][ii][jj];
for(int f=0;f<=3;f++)
{
x=i+dx[f];
y=j+dy[f];
move(k,i,j,x,y);
if (compare())
{num++;
// print(k);
// system("pause");
}
else if(Find(k)) {
t=k;k++;
father[k]=t;
tryy(t);
}
}
}
void print(int k) {
int z[1000],i=1,j,j1,buzhou;
z[1]=k;
while (father[k]!=0)
{i++;
z[i]=father[k];
k=z[i];
}
buzhou=i;
while (i>0)
{for (j=0;j<=2;j++)
{for(j1=0;j1<=2;j1++)
cout<<map[z[i]][j][j1];
cout<<endl;
}
cout<<endl;
i--;
}
cout<<"第"<<num<<"种变化方案共"<<buzhou<<endl;
}
void FindZero(int t,int &i,int &j) {
for(int x=0;x<=2;x++)
for(int y=0;y<=2;y++)
if(map[t][x][y]==0) {
i=x;
j=y;
}
}