⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mm.h

📁 骨牌问题的一个较快速度的算法
💻 H
字号:
	void visit(Point[7][8],Point[7][8],int,int,int);
	void show(Point[7][8]);
	void copyf(Point[7][8],Point[7][8]);
	int count=0;

	void Gp(Point A[7][8],Point B[7][8]){
		bool IsEnd;
		IsEnd=false;
		int i=0,j=0;
		while(i<7&&A[i][j].visited){
			while(j<8&&A[i][j].visited)j++;//取得第一个没有被访问过的数
			if(j==8){
				i++;//从第二个循环中退出来的时候i++了
				j=0;
			}
		}
		if(i==7&&j==0&A[i-1][j-1].visited){
			IsEnd=true;//判断是否已经遍历完数组
			count++;//这是一个正确的解
			cout<<endl<<"得到第"<<count<<"个解,如下:"<<endl;
			show(A);
		}
		else{
			Point C[7][8],D[7][8];
			if(j<7){//j=7不能进行第一模式访问(横向访问)
				copyf(A,C);
				copyf(B,D);
 				visit(C,D,i,j,1);
			}
			if(i<6){//i=6不能进行第二模式访问(纵向访问)
				copyf(A,C);
				copyf(B,D);
				visit(C,D,i,j,2);
			}
		}
	}

	void visit(Point A[7][8],Point B[7][8],int i,int j,int mode){
//		cout<<"A["<<i<<"]["<<j<<"]="<<A[i][j].data<<"  Mode="<<mode<<endl;
		if(mode==1&&!A[i][j+1].visited&&!B[A[i][j].data][A[i][j+1].data].visited){
			A[i][j].visited=true;
			A[i][j+1].visited=true;
			if(A[i][j].data<7||A[i][j+1].data<7){
				B[A[i][j].data][A[i][j+1].data].visited=true;
				A[i][j].data=B[A[i][j].data][A[i][j+1].data].data;
				A[i][j+1].data=A[i][j].data;//A[i][j].data已经改变,不能再用上面右边的表达式
				Gp(A,B);
			}
			else cout<<"有错误产生!!"<<endl;
		}
		if(mode==2&&!A[i+1][j].visited&&!B[A[i][j].data][A[i+1][j].data].visited){
			A[i][j].visited=true;
			A[i+1][j].visited=true;
			if(A[i][j].data<7||A[i+1][j].data<7){
				B[A[i][j].data][A[i+1][j].data].visited=true;
				A[i][j].data=B[A[i][j].data][A[i+1][j].data].data;
				A[i+1][j].data=A[i][j].data;
				Gp(A,B);
			}
			else cout<<"有错误产生!!"<<endl;
		}
	}

	void show(Point A[7][8]){
		for(int i=0;i<7;i++){
			for(int j=0;j<8;j++){
				if(A[i][j].data<10)cout<<"    ("<<i<<","<<j<<")"<<A[i][j].data;
				else cout<<"   ("<<i<<","<<j<<")"<<A[i][j].data;
			}
			cout<<endl;
		}
	}

	void copyf(Point A[7][8],Point B[7][8]){
		for(int i=0;i<7;i++)
			for(int j=0;j<8;j++)B[i][j]=A[i][j];
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -