【原创-源码全文】|源码全文-日历拼图游戏的解决方案(C语言-进阶应用)-详解连载5

【原创】|日历拼图游戏的解决方案(C语言-进阶应用)-详解连载1_zhuyi8120的博客-CSDN博客
【原创】|日历拼图游戏的解决方案(C语言-进阶应用)-详解连载2_zhuyi8120的博客-CSDN博客
【原创】|日历拼图游戏的解决方案(C语言-进阶应用)-详解连载3_zhuyi8120的博客-CSDN博客
【原创】|日历拼图游戏的解决方案(C语言-进阶应用)-详解连载4_zhuyi8120的博客-CSDN博客

本文的阅读量还是比较多的(5个帖子,总共已经有2200多阅读),而本帖之前设置为vip可读时,已经过去了3天,到目前只有12个人看。​​​​​​还是改为粉丝可见吧。

最近发现,要穷举所有的可能,还是会出问题,我再完善下。如果调好了,再发上全文。

这是今天(12月10日)的计算

C语言实现6:返回再上一层的代码

前面的分析已经比较多了。能看到这里的,基本上也已经知道怎么做的了。

这里直接上全文的源代码吧。

#include<stdio.h>
#include<windows.h>

struct pmarch{
		int ib;//var
		int i;//main
		int ixy;//march Number
		int x;//march y
		int y;//march y
		struct pmarch * pre;
		struct pmarch * left;
		struct pmarch * right;
		struct pmarch * next;
	};
struct pmarch * head, * end, * tmp;

struct pmarch * addpointer(){
	struct pmarch * p=(struct pmarch * )malloc(sizeof(struct pmarch));
	return p;
}
	
int main(){
	char cA[8][4][4]={	
	{{'A','A','A','-'},
	{'-','A','A','-'},
	{'-','-','-','-'},
	{'-','-','-','-'}},	
		
	{{'B','B','B','B'},
	{'-','-','-','B'},
	{'-','-','-','-'},
	{'-','-','-','-'}},
	
	{{'C','C','C','C'},
	{'-','-','C','-'},
	{'-','-','-','-'},
	{'-','-','-','-'}},
	
	{{'D','-','-','-'},
	{'D','D','-','-'},
	{'-','D','-','-'},
	{'-','D','-','-'}},
	
	{{'E','E','-','-'},
	{'-','E','-','-'},
	{'-','E','E','-'},
	{'-','-','-','-'}},	

	{{'F','F','F','-'},
	{'F','-','F','-'},
	{'-','-','-','-'},
	{'-','-','-','-'}},
	
	{{'G','G','G','-'},
	{'G','-','-','-'},
	{'G','-','-','-'},
	{'-','-','-','-'}},
	
	{{'H','H','H','-'},
	{'H','H','H','-'},
	{'-','-','-','-'},
	{'-','-','-','-'}}};

	int xem[4]={0,0,0,0},yem[4]={0,0,0,0};
	int xmv=0,ymv=0;
	int ii=0,jj=0;

	
	char b[8][8][4][4];
	char Tar[8][8][100][4][4];
	char ctemp[7][7];
	int i,j,k,l,ib;
	int iMax=3;
	int xlng[8][8],ylng[8][8];
	
	int counti=0;
	
	printf("Init is over.\n");

///creat 8 martin, 
	for(i=0;i<4;i++){
		for(j=0;j<4;j++){
			//printf("tag[%d][%d]:",i,j);
			for(k=0;k<4;k++){
				//printf("cA[%d][%d][%d]=%c\n",i,j,k,cA[i][j][k]);
				b[0][i][j][k]=cA[i][j][k];
				b[1][i][j][k]=cA[i][j][iMax-k];
				b[2][i][j][k]=cA[i][iMax-j][k];
				b[3][i][j][k]=cA[i][iMax-j][iMax-k];
				b[4][i][j][k]=cA[i][k][j];
				b[5][i][j][k]=cA[i][k][iMax-j];
				b[6][i][j][k]=cA[i][iMax-k][j];
				b[7][i][j][k]=cA[i][iMax-k][iMax-j];
			}//k
		}//j
	}//i
	
	for(i=4;i<5;i++){
		for(j=0;j<4;j++){
			//printf("tag[%d][%d]:",i,j);
			for(k=0;k<4;k++){
				//printf("cA[%d][%d][%d]=%c\n",i,j,k,cA[i][j][k]);
				b[0][i][j][k]=cA[i][j][k];
				b[1][i][j][k]=cA[i][j][iMax-k];				
				b[2][i][j][k]=cA[i][k][j];
				b[3][i][j][k]=cA[i][k][iMax-j];
				b[4][i][j][k]=cA[i][iMax-j][k];
				b[5][i][j][k]=cA[i][iMax-j][iMax-k];
				b[6][i][j][k]=cA[i][iMax-k][j];
				b[7][i][j][k]=cA[i][iMax-k][iMax-j];
			}//k
		}//j
	}//i
	
	for(i=5;i<6;i++){
		for(j=0;j<4;j++){
			//printf("tag[%d][%d]:",i,j);
			for(k=0;k<4;k++){
				//printf("cA[%d][%d][%d]=%c\n",i,j,k,cA[i][j][k]);
				b[0][i][j][k]=cA[i][j][k];				
				b[1][i][j][k]=cA[i][iMax-j][k];				
				b[2][i][j][k]=cA[i][k][j];
				b[3][i][j][k]=cA[i][iMax-k][j];
				b[4][i][j][k]=cA[i][j][iMax-k];
				b[5][i][j][k]=cA[i][iMax-j][iMax-k];
				b[6][i][j][k]=cA[i][k][iMax-j];
				b[7][i][j][k]=cA[i][iMax-k][iMax-j];
			}//k
		}//j
	}//i
	
	for(i=6;i<7;i++){
		for(j=0;j<4;j++){
			//printf("tag[%d][%d]:",i,j);
			for(k=0;k<4;k++){
				//printf("cA[%d][%d][%d]=%c\n",i,j,k,cA[i][j][k]);
				b[0][i][j][k]=cA[i][j][k];
				b[1][i][j][k]=cA[i][j][iMax-k];
				b[2][i][j][k]=cA[i][iMax-j][k];
				b[3][i][j][k]=cA[i][iMax-j][iMax-k];
				b[4][i][j][k]=cA[i][k][j];
				b[5][i][j][k]=cA[i][k][iMax-j];
				b[6][i][j][k]=cA[i][iMax-k][j];
				b[7][i][j][k]=cA[i][iMax-k][iMax-j];
			}//k
		}//j
	}//i
	
	for(i=7;i<8;i++){
		for(j=0;j<4;j++){
			//printf("tag[%d][%d]:",i,j);
			for(k=0;k<4;k++){
				//printf("cA[%d][%d][%d]=%c\n",i,j,k,cA[i][j][k]);
				b[0][i][j][k]=cA[i][j][k];
				b[1][i][j][k]=cA[i][k][j];
				b[2][i][j][k]=cA[i][j][iMax-k];
				b[3][i][j][k]=cA[i][iMax-j][k];
				b[4][i][j][k]=cA[i][iMax-j][iMax-k];
				b[5][i][j][k]=cA[i][k][iMax-j];
				b[6][i][j][k]=cA[i][iMax-k][j];
				b[7][i][j][k]=cA[i][iMax-k][iMax-j];
			}//k
		}//j
	}//i
	
/*	for(i=0;i<8;i++){
		for(j=0;j<8;j++){
			for(k=0;k<4;k++){
				for(l=0;l<4;l++){
					printf("%c",b[j][i][k][l]);
				}
				printf("\n");
			}
		}
	}
*/
printf("the first part is over!one have become eight.tag martix is init.\n");
//scanf("%d",&i);

做规整计算


for(ib=0;ib<8;ib++){ 
	for(i=0;i<8;i++){
//		printf("b[%d][%d]:\n",ib,i);


	for(j=0;j<4;j++){
		xem[j]=0;
		for(k=0;k<4;k++){
			if(b[ib][i][j][k]=='-'){
				xem[j]++;
			}//if
		}
//		printf("xem[%d]:%d\n",j,xem[j]);
	}
		
	/test xem//
	xmv=0;
	if(xem[0]==4){
		xmv++;
		if(xem[1]==4){
			xmv++;
			if(xem[2]==4){
				xmv++;
			}
		}
		 
	}//if
	//printf("xmv=%d\n",xmv);
			//printf("b[%d][%d]:\n",ib,i);
	//xlng[ib][i]=0;//mark the length of x direction

	
	//move-1
	for(j=0;j<(4-xmv);j++){
		//printf("cA[%d]:\n",i);
		for(k=0;k<4;k++){					
			b[ib][i][j][k]=b[ib][i][j+xmv][k];
		}//for k
	}//for j
	
	//move-2:fill the empty
	for(j=4-xmv;j<4;j++){
		//printf("cA[%d]:\n",i);
		for(k=0;k<4;k++){					
			b[ib][i][j][k]='-';
		}//for k
	}//for j	

	//print

end 1

/the 2	
	for(k=0;k<4;k++){
		yem[k]=0;
		for(j=0;j<4;j++){
			if(b[ib][i][j][k]=='-'){
				yem[k]++;
			}//if
		}
//		printf("yem[%d]:%d\n",k,yem[k]);
	}
		
	/test xem//
	ymv=0;
	if(yem[0]==4){
		ymv++;
		if(yem[1]==4){
			ymv++;
			if(yem[2]==4){
				ymv++;
			}
		}
		 
	}//if
	//printf("ymv=%d\n",ymv);
//	printf("b[%d][%d]:\n",ib,i);
	

	//move-1
	for(k=0;k<(4-ymv);k++){
		//printf("cA[%d]:\n",i);
		for(j=0;j<4;j++){					
			b[ib][i][j][k]=b[ib][i][j][k+ymv];
		}//for k
	}//for j
	
	//move-2:fill the empty
	for(k=4-ymv;k<4;k++){
		//printf("cA[%d]:\n",i);
		for(j=0;j<4;j++){					
			b[ib][i][j][k]='-';
		}//for k
	}//for j	
//	ylng[ib][i]=0;//mark the length of x direction

	

	//print
	for(j=0;j<4;j++){		
		for(k=0;k<4;k++){
			//printf("%c",b[ib][i][j][k]);
		}
		//printf("\n");
		

	}

end of order

	}//i
	}//ib
printf("the second part is over!they are ordered.\n");
/*for(i=0;i<8;i++){
		for(j=0;j<8;j++){
			for(k=0;k<4;k++){
				for(l=0;l<4;l++){
					printf("%c",b[j][i][k][l]);
				}
				printf("\n");
			}
		}
	}
*///scanf("%d",&i);

///mark the x-length and y-length
for (ib=0;ib<8;ib++){
	for(i=0;i<8;i++){

	xlng[ib][i]=0;
	for(j=0;j<4;j++){
		xem[j]=0;
		for(k=0;k<4;k++){
			if(b[ib][i][j][k]=='-'){
				xem[j]++;
			}//if
		
	}//for k
	//printf("xem[%d]:%d\n",j,xem[j]);
		if(xem[j]<4){
			xlng[ib][i]++;
		}
}//for j
	//printf("xlng[%d][%d]:%d\n",ib,i,xlng[ib][i]);

	ylng[ib][i]=0;
	for(k=0;k<4;k++){
		yem[k]=0;
		for(j=0;j<4;j++){
			if(b[ib][i][j][k]=='-'){
				yem[k]++;
			}//if
		
	}//for k
	//printf("yem[%d]:%d\n",k,yem[k]);
		if(yem[k]<4){
			ylng[ib][i]++;
		}
}//for j
	//printf("ylng[%d][%d]:%d\n",ib,i,ylng[ib][i]);



	//x-long is ok.


//		printf("yem[%d]:%d\n",k,yem[k]);
	}//for i
//	printf("y-long[%d][%d]:%d\n",ib,i,ylng[ib][i]);
		}///for ib
printf("the third part is over.they had remark the length.\n");

int iii=0,jjj=0;
int finaltest=0;

for(iii=0;iii<7;iii++){
	for(jjj=0;jjj<7;jjj++){
		ctemp[iii][jjj]='-';

	}
}
ctemp[0][6]='Z';
ctemp[1][6]='Z';
ctemp[6][3]='Z';
ctemp[6][4]='Z';
ctemp[6][5]='Z';
ctemp[6][6]='Z';
ctemp[1][5]='X';
ctemp[3][2]='X';


//march the target and martin
	int vartime=0;
	struct pmarch *p[8][400];

	head=addpointer();
	p[0][0]=addpointer();
		head->pre=NULL;
		head->left =NULL;
		head->right =NULL;
		head->next =NULL;
		
	vartime =0;
	int irsl=0;
	for(iii=0;iii<7;iii++){
	for(jjj=0;jjj<7;jjj++){
		ctemp[iii][jjj]='-';

	}
}

ctemp[0][6]='Z';
ctemp[1][6]='Z';
ctemp[6][3]='Z';
ctemp[6][4]='Z';
ctemp[6][5]='Z';
ctemp[6][6]='Z';
ctemp[1][5]='X';
ctemp[3][2]='X';

//初始化,貌似可以合并到里面去的。
for(ib=0;ib<8;ib++){

	for (j=0;j<=8-xlng[0][ib];j++){
		for(k=0;k<=8-ylng[0][ib];k++){
			//test for fill
			counti=0;
	//printf("j=%d,k=%d\n",j,k);
			//printf("-10,vartime=%d\n",vartime);
			//printf("1.ii<xlng=%d,jj<ylng=%d\n",xlng[0][0],ylng[0][0]);
			for(ii=0;ii<xlng[0][ib];ii++){
				for(jj=0;jj<ylng[0][ib];jj++) {
					//printf("ii=%d,jj=%d\n",ii,jj);
					if ((ctemp[j+ii][k+jj]!='-')&&(b[0][ib][ii][jj]!='-')){
						counti++;
					}// jj if
				}//for jj
			}//for ii
			//when it fill
			if(counti==0){
				if (vartime==0){
					p[0][vartime]->left=NULL;
					p[0][vartime]->right =NULL;
					p[0][vartime]->pre =head;
					head->next=p[0][0];
					p[0][vartime]->next=NULL;
					//printf("12,vartime=%d\n",vartime);
				}
				else{
					//printf("2,vartime=%d\n",vartime);
					p[0][vartime]=addpointer();
					p[0][vartime-1]->right =p[0][vartime];
					p[0][vartime]->left =p[0][vartime-1];
					p[0][vartime]->right=NULL;
					p[0][vartime]->next =NULL;
     			}
	     			p[0][vartime]->i=0;
					p[0][vartime]->ib=ib;
					p[0][vartime]->ixy=vartime;
					p[0][vartime]->x=j;
					p[0][vartime]->y=k;
				vartime++;
				//printf("21,vartime=%d\n",vartime);
			}
		}
	}
}	
	tmp=addpointer();
	
	int ibtmp=0,itmp=0,ixytmp=0;
i=0;
ib=0;
long long countii=0;
while(irsl<1){
	countii++;
//	printf("\n\n\n");
//	printf("%d\n\n\n",countii);
//init the first target
for(iii=0;iii<7;iii++){
	for(jjj=0;jjj<7;jjj++){
		ctemp[iii][jjj]='-';

	}
}

ctemp[0][6]='Z';
ctemp[1][6]='Z';
ctemp[6][3]='Z';
ctemp[6][4]='Z';
ctemp[6][5]='Z';
ctemp[6][6]='Z';
ctemp[1][5]='X';
ctemp[3][2]='X';

	tmp=head->next;
	//init the ctemp-martix
	while(tmp!=NULL){
		ib=tmp->ib;
		i=tmp->i;
		for(ii=0;ii<xlng[ib][i];ii++){
   			for(jj=0;jj<ylng[ib][i];jj++){
				//if ((ctemp[tmp->x+ii][tmp->y+jj]=='-')&&(b[ib][i][ii][jj]!='-')){
				if (b[ib][i][ii][jj]!='-'){	
					ctemp[tmp->x+ii][tmp->y+jj]=b[ib][i][ii][jj];
				}
			}//for jj
		}//for ii



		ibtmp=tmp->ib;
		itmp=tmp->i;
		ixytmp=tmp->ixy;
		tmp=tmp->next;
	}//first fill
	i=itmp+1;
//------------------
/*		printf("inited target:\n");
		for(ii=0;ii<7;ii++){
			for(jj=0;jj<7;jj++){
				printf("%c",ctemp[ii][jj]);
			}
			printf("\n");
		}*/
vartime=0;
int ibb=0;
if((i==4||i==5||i==6)){
	ibb=4;
}
if(i==7){
	ibb=2;
}
if(i<4){
	ibb=8;
}
for (ib=0;ib<ibb;ib++){
	
	for (j=0;j<=7-xlng[ib][i];j++){
		for(k=0;k<=7-ylng[ib][i];k++){
			counti=0;
			for(ii=0;ii<xlng[ib][i];ii++){
				if(j+ii>=7){counti++;}
					for(jj=0;jj<ylng[ib][i];jj++){
						
					//printf("ii=%d,jj=%d\n",ii,jj);
						if(k+jj>=7){counti++;}//if k+jj
						if ((ctemp[j+ii][k+jj]!='-')&&(b[ib][i][ii][jj]!='-')){
							counti++;
						}
						
						//if(itmp+1==3){
						//	printf("ib=%d,j=%d,ii=%d,k=%d,jj=%d,counti=%d\n",ib,j,ii,k,jj,counti);
						//}
				}//for jj
				
			}//for ii
			//when it fill
			if(counti==0){
				//printf("i=%d,ib=%d,x=%d,y=%d\n",i,ib,j,k);
				if (vartime==0){
					//printf("when vartime=0;ib=%d,i=%d,j=%d,k=%d\n",ib,i+1,j,k);
					p[i][vartime]=addpointer();
					p[i][vartime]->left=NULL;
					p[i][vartime]->right =NULL;
					p[i][vartime]->pre =p[itmp][ixytmp];
					//printf("p[itmp+1=%d][ib=%d][vartime=%d]->pre =p[itmp=%d][ibtmp=%d][ixytmp=%d]\n",itmp+1,ib,vartime,itmp,ibtmp,ixytmp);
					p[itmp][ixytmp]->next=p[i][vartime];
					p[i][vartime]->right =NULL;
					p[i][vartime]->next =NULL;
					//printf("p[%d][%d][%d]->right=%0x\n",ib,itmp+1,vartime,p[ib][itmp+1][vartime]->right);
				}
				else{
					//printf("when vartime>0;ib=%d,i=%d,j=%d,k=%d\n",ib,i,j,k);
					p[i][vartime]=addpointer();
					p[i][vartime-1]->right =p[i][vartime];
					p[i][vartime]->left =p[i][vartime-1];
					//printf("p[itmp+1=%d][ib=%d][vartime=%d]->pre =p[itmp+1=%d][ib=%d][vartime-1=%d]\n",itmp+1,ib,vartime,itmp+1,ib,vartime-1);
					p[i][vartime]->right=NULL;
					p[i][vartime]->next =NULL;

					
     			}
	     			p[i][vartime]->i=itmp+1;
					p[i][vartime]->ib=ib;
					p[i][vartime]->ixy=vartime;
					p[i][vartime]->x=j;
					p[i][vartime]->y=k;
					vartime++;
     			}
			}
		}
	}
	
//-----------------


/*	tmp=head->next;
	while(tmp!=NULL){
		printf("1.【ib=%d,i=%d,ixy=%d,x=%d,y=%d】->",tmp->ib,tmp->i,tmp->ixy,tmp->x,tmp->y);
		tmp=tmp->next;
	}
	printf("\n");
*/	
/

if(vartime==0){
	tmp=head->next;
	while(tmp->next!=NULL){
		tmp=tmp->next;
	}
		while(tmp->right==NULL){
			tmp=tmp->pre;
			if(tmp==head){
			break;
			}
		}
		if(tmp==head){
			head->next=head->next->right;
			head->next->pre=head;
		}
		else{
			tmp->pre->next=tmp->right;
			tmp->right->pre=tmp->pre;	
		}
		}
///
	finaltest=0;
		for(iii=0;iii<7;iii++){
			for(jjj=0;jjj<7;jjj++){
				if(ctemp[iii][jjj]=='-'){
					finaltest++;				
				}	
				
			}
		}
if(countii%10000==0){
		printf("\n\n");
		printf("正在进行第%d次尝试,还在继续...\n\n",countii);
		for(ii=0;ii<7;ii++){
			for(jj=0;jj<7;jj++){
				printf("%c",ctemp[ii][jj]);
			}
			printf("\n");
			
}
tmp=head->next;
	while(tmp!=NULL){
		printf("【ib=%d,i=%d,ixy=%d,x=%d,y=%d】->",tmp->ib,tmp->i,tmp->ixy,tmp->x,tmp->y);
		tmp=tmp->next;
	}
	printf("\n");
}
		if(finaltest==0){
		printf("\n\n");
		printf("After %d times, we get the final target:\n",countii);
		for(ii=0;ii<7;ii++){
			for(jj=0;jj<7;jj++){
				printf("%c",ctemp[ii][jj]);
			}
			printf("\n");
		}
			irsl++;
		tmp=head->next;
		int finalint=1;
	while(tmp!=NULL){
		printf("%d.【ib=%d,i=%d,ixy=%d,x=%d,y=%d】->\n",finalint,tmp->ib,tmp->i,tmp->ixy,tmp->x,tmp->y);
		tmp=tmp->next;
		finalint++;
	}
	printf("\n");	
			
		}
		
	
}

return 0;	
}

代码段9:源码全文

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值