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

📄 app1.cpp

📁 这是一个我们经常玩的魔方游戏的代码
💻 CPP
字号:
//解析交换方式----------及第几列的数据
#define MAX 0xff
//#define debug
#include"array.h"
void array::init1()
{
	int i=n/2,j=0,k;
	for(k=0;k<n*n;k++)
	{
head:
		if(head[i+j*n]==0)
		{
			head[j*n+i]=k+1;
		}
		else
		{
			j+=2;
			if(--i==-1)i=n-1;
			if(j>n)j-=n;
			goto head;
		}
		if(--j==-1)j=n-1;
		if(++i==n)i=0;
	}
}

void array::init()
{
	int i,j,end,temp,jg,flag;
	lbiao t;
	if(n!=n/2*2)
	{
		init1();
		return;
	}
	else
	{
		if(n!=n/4*4)end=n/2;
		else end=n/4;
	}
	for(i=0;i<end;i++)
	{
		for(j=0;j<n/2;j++)
		{
			temp=2*n*i+2*j;
			jg=n*i+j;
			head[temp]=jg+1;
			head[temp+1]=n*n-jg;
			head[temp+n]=n*n-jg-n/2;
			head[temp+n+1]=jg+n/2+1;
		}
	}
	for(;i<n/2;i++)
	{
		for(j=0;j<n/2;j++)
		{
			temp=2*n*i+n-1-2*j;
			jg=n*i+j;
			head[temp]=jg+1;
			head[temp-1]=n*n-jg;
			head[temp+n]=n*n-jg-n/2;
			head[temp+n-1]=jg+n/2+1;
		}
	}
	if(n/4*4!=n)
	{
		for(i=0;i<n/4;i++)
		{
			head[i*2]+=n*n/4;
			head[i*2+n*n/2+1]-=n*n/4;
		}
		head[i*2+n*n/2+n]+=n*n/4;
		head[i*2+n*n/2+n+1]-=n*n/4;
		for(i++;i<n/2;i++)
		{
			head[i*2+1]-=n*n/4;
			head[i*2+n*n/2]+=n*n/4;
		}
	}
	flag=3;
	if(n>7)flag=(1<<n)-1;
	flag=50;
	jian_lb(t,flag,*this);
	if(!e)zjh(*this,t.head,t.head,flag);

}
void array::jxi(char *a,int b)
{
	int temp=1<<(n-1);
	int i,j;//i循环变量,j为a的位数,temp用于检验位是否为真
	a[0]=1;
	for(i=1;i<sizeof(int)*8;i++)
	{
		a[i]=0;
	}
	if(b==temp*2-1||b==temp-1)
	{//横竖全交换
		if(b>temp)a[0]=n;
		for(i=1;i<n+1;i++)
		{
			a[i]=i-1;
		}
		a[i]=char(MAX);
		return;
	}
	if(b>temp)
	{
		a[0]=n;//a[0]==n表示以行为基准,在交换时使用
		b-=temp;
	}
	temp=1;
	for(i=0,j=1;i<sizeof(int)*8;i++)
	{
		if(b&temp)a[j++]=i;
		temp<<=1;
	}
	a[j]=char(MAX);//结束标志
	return;
}

void array::jian_lb(lbiao &a,int flag,array &x)//建立交换行标的链表		
{
	int T=1<<(n-1);//T为2的n-1次方
	int i,j,t1,t2;
	char*xch=NULL;//记录交换方式
	xch=new char[sizeof(int)*8];
	jxi(xch,flag);
	if(flag==T)return;
	if(flag==T-1||flag==T*2-1)//整行交换,第一行不需要与后半部分交换
	{//求第零行的方式
		for(j=1;j<n/2;j++)
		{
			a.add(new addrs(0,j));
		}
		for(i=1;i<n;i++)
			for(j=i+1;j<n;j++)
			{
				a.add(new addrs(i,j));
			}
		delete[] xch;
		return;
	}
	if(xch[2]==char(MAX))
	{
			delete[] xch;
			return;
	}
	for(i=0;i<n;i++)//n为行数;该函数为array的友元
	{
		t1=qh(x,xch,i);
		for(j=i+1;j<n;j++)
		{
			t2=qh(x,xch,j);
			if(t1==t2)
			{
				a.add(new addrs(i,j));
			}
		}
	}

	delete[] xch;
	return;
}//建立的链表中每一个节点都满足fir与sec的xch规则和相同,可以按xch规则进行交换

int array::qh(array &a,char *xch,int k)
{
	int temp=0,bs1,bs2;

	bs2=xch[0];//倍数
	bs1=n+1-bs2;
	for(int i=1;xch[i]!=char(MAX);i++)
	{
		temp+=a.head[k*bs1+xch[i]*bs2];
	}
	return temp;
}//计算第k行(列)的xch规则和

//以下为实现交换的过程,在循环中调用
void array::jiaohuan(array &a,addrs &b,int flag)
{
	int i,bs1,bs2,temp;//bs的改变实现xch对应行或列的交换
	char *xch;//xch储存交换的方式	
	xch=new char[sizeof(int)*8];
	jxi(xch,flag);//解析交换方式

	bs2=xch[0];
	bs1=n+1-bs2;
	for(i=1;xch[i]!=char(MAX);i++)
	{
		temp=a.head[b.fir*bs1+xch[i]*bs2];
		a.head[b.fir*bs1+xch[i]*bs2]=a.head[b.sec*bs1+xch[i]*bs2];
		a.head[b.sec*bs1+xch[i]*bs2]=temp;
	}
	delete[]xch;
}

//以下为主交换程序,递归
void array::zjh(array &x,addrs*head,addrs *bg,int flag)
{
	if(e)return;
	int temp=1<<n;
	lbiao t;
	addrs  *now=NULL;//h为新链表的头
	array x1(x);
	if(bg==NULL)//x对此类交换已经完成
	{
		if(++flag==temp)return;
		jian_lb(t,flag,x);
		if(!e)zjh(x,t.head,t.head,flag);	
	}
	else
	{
		zjh(x,head,bg->next,flag);
		jiaohuan(x1,*bg,flag);
		if(x1.xright())
		{
			this->update(x1);
			e=true;
			return;
		}
		temp=bg->fir;
		now=head;
		while(now!=bg)
		{
			if(now->fir==temp||*now!=*bg)
			{
				t.add(*now);
			}
			now=now->next;
		}
		now=now->next;
		while(now!=NULL)
		{
			if(now->fir==temp)
			{
				t.add(*now);
			}
			now=now->next;
		}
//建立为x1的新链表
		zjh(x1,t.head,t.head,flag);
	}

}

⌨️ 快捷键说明

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