【原创】|日历拼图游戏的解决方案(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:源码全文