出了问题的代码 八数码问题

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;
			}
}


 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值