c_la...@yahoo.com.cn
unread,Oct 24, 2008, 12:32:54 AM10/24/08Sign in to reply to author
Sign in to forward
You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to ck436的讨论组
小弟在用c语言,在dos下编写一个自动还原魔方的算法。 用的是这个c语言的界面环境。研究一阵子,才发现,经过几次变换后,在一些特定步骤,这个
环境会发生一些错误,严重影响影响自动还原。例如,定名顺时针 + 左面 逆时针 时,
这个界面的 副加 视图 显示的魔方块,明显是错误的,。
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<graphics.h>
int a[3][3]={1,1,1,1,1,1,1,1,1}; /*INITIALIZE SIX
PLANS*/
int b[3][3]={2,2,2,2,2,2,2,2,2};
int c[3][3]={4,4,4,4,4,4,4,4,4};
int d[3][3]={3,3,3,3,3,3,3,3,3};
int e[3][3]={5,5,5,5,5,5,5,5,5};
int f[3][3]={7,7,7,7,7,7,7,7,7};
int top[3][3],front[3][3],side[3][3];
int position=0,temp[3]={0,0,0},new[3][3]; /*POSITION
ASSIGN THE ARROW POSITION*/
int sign;
main()
{
int l=60,x=50,y=50,key,count,input=0,errorcode; /*L
MEANS THE LENTH OF THE SQUARE,X MEANS THE INITAIL POSITION OF X,Y
MEANS THE INITIAL POSITION OF Y*/
int a1[3][3]={1,1,1,1,1,1,1,1,1}; /*INITIALIZE SIX
PLANS FOR BACKUP*/
int b1[3][3]={2,2,2,2,2,2,2,2,2};
int c1[3][3]={4,4,4,4,4,4,4,4,4};
int d1[3][3]={3,3,3,3,3,3,3,3,3};
int e1[3][3]={5,5,5,5,5,5,5,5,5};
int f1[3][3]={7,7,7,7,7,7,7,7,7};
int graphdriver=VGA,graphmode=VGAHI;
initgraph(&graphdriver,&graphmode,"");
errorcode = graphresult();
if (errorcode != grOk) /*MEET ERROR*/
{ /*SHOW THE
ERROE*/
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to exit:");
getch();
exit(1);
}
drawing(x,y,l); /*DRAWING THE
BIG SQUARE*/
drawing(x+400,y,l/2); /*DRAWING THE
SMALL SQUARE*/
do
{
sign=position%3; /*COPY DATA TO
SHOW*/
copy (&a,&top);
copy (&b,&front);
copy (&c,&side);
color(x,y,l); /*SHOWING THE
BIG SQUARE*/
copy (&e,&top);
change2(&top,1);
copy (&f,&front);
change2(&front,2);
copy (&d,&side);
color(x+400,y,l/2); /*SHOWING THE
SMALL SQUARE*/
setcolor(14);
arrow(x,y,l);
key=bioskey(0); /*READ KEYBORD*/
switch(key)
{
int i,j;
case 283:printf("Esc"); /*IF
INPUT_KEY="ESC" TO EXIT THE PROGRAM*/
goto end;
case 20480:setcolor(0); /*IF
INPUT_KEY="DOWN" TO CHANGE THE ARROW*/
arrow(x,y,l);
if(position==8)
position=0;
else
position=position+1;
break; /*IF
INPUT_KEY="UP" TO CHANGE THE ARROW*/
case 18432:setcolor(0);
arrow(x,y,l);
if(position==0)
position=8;
else
position=position-1;
break;
case 19712:input=1; /*IF
INPUT_KEY="RIGHT" TO MOVE FORWARD*/
break;
case 19200:input=3; /*IF
INPUT_KEY="LEFT" TO MOVE REWARD*/
break;
case 7181: setcolor(0); /*IF
INPUT_KEY="ENTER" TO RELOAD */
arrow(x,y,l);
copy(&a1,&a);
copy(&b1,&b);
copy(&c1,&c);
copy(&d1,&d);
copy(&e1,&e);
copy(&f1,&f);
position=0;
break;
case 14624:setcolor(0); /*IF
INPUT_KEY="SPACE" TO RANDOM MOVE*/
arrow(x,y,l);
randomize();
position=random(9);
input=1;
break;
case 6512:for(i=0;i<3;i++)
{
copy(&b,&a);
for(j=0;j<3;j++)
printf("%d",a[i][j]);
}
printf("\n");
break;
}
if(input!=0) /*USE POSITION
TO JUDGE AND CHANGE DATA*/
{ /*IF
INPUT=0,CHANGE CLOCKWISE,IF INPUT=3,CHANGE REVERSE-CLOCKWISE*/
for(count=0;count<input;count++)
{
if(position/3==0) /*IF NEED TO
CHANGE TOP*/
{
change2(&b,1);
change2(&c,1);
change2(&d,3);
change2(&f,1);
change1(&b,&c);
change1(&c,&d);
change1(&d,&f);
change1(&f,&b);
change2(&b,3);
change2(&c,3);
change2(&d,1);
change2(&f,3);
temp[0]=0;temp[1]=0;temp[2]=0;
if(position%3==0)
change2(&a,1);
if(position%3==2)
change2(&e,1);
}
if(position/3==1) /*IF NEED TO
CHANGE FRONT*/
{
change1(&a,&b);
change1(&b,&e);
change1(&e,&d);
change1(&d,&a);
temp[0]=0;temp[1]=0;temp[2]=0;
if(position%3==0)
change2(&f,1);
if(position%3==2)
change2(&c,1);
}
if(position/3==2) /*IF NEED TO
CHANGE SIDE*/
{
change2(&a,3);
change2(&e,1);
change2(&f,2);
change1(&a,&c);
change1(&c,&e);
change1(&e,&f);
change1(&f,&a);
change2(&a,1);
change2(&e,3);
change2(&f,2);
temp[0]=0;temp[1]=0;temp[2]=0;
if(position%3==0)
change2(&b,1);
if(position%3==2)
change2(&d,1);
}
}
input=0;
}
}
while(1);
end:
clearviewport(); /*CLEAR THE
SCREEN*/
}
drawing(int inital_x,int inital_y,int lenth) /*DRAWING THE
STRUCTURE OF THE PICTURE*/
{
setlinestyle(0,0,3);
line(inital_x+1.5*lenth,inital_y+0,inital_x+4.5*lenth,inital_y+0);
line(inital_x+1.0*lenth,inital_y+0.5*lenth,inital_x+4.0*lenth,inital_y
+0.5*lenth);
line(inital_x+0.5*lenth,inital_y+1*lenth,inital_x+3.5*lenth,inital_y
+1*lenth);
line(inital_x+0,inital_y+1.5*lenth,inital_x+3*lenth,inital_y
+1.5*lenth);
line(inital_x+0,inital_y+2.5*lenth,inital_x+3*lenth,inital_y
+2.5*lenth);
line(inital_x+0,inital_y+3.5*lenth,inital_x+3*lenth,inital_y
+3.5*lenth);
line(inital_x+0,inital_y+4.5*lenth,inital_x+3*lenth,inital_y
+4.5*lenth);
line(inital_x+0,inital_y+1.5*lenth,inital_x+0,inital_y+4.5*lenth);
line(inital_x+1.0*lenth,inital_y+1.5*lenth,inital_x+1.0*lenth,inital_y
+4.5*lenth);
line(inital_x+2.0*lenth,inital_y+1.5*lenth,inital_x+2.0*lenth,inital_y
+4.5*lenth);
line(inital_x+3.0*lenth,inital_y+1.5*lenth,inital_x+3.0*lenth,inital_y
+4.5*lenth);
line(inital_x+3.5*lenth,inital_y+1.0*lenth,inital_x+3.5*lenth,inital_y
+4.0*lenth);
line(inital_x+4.0*lenth,inital_y+0.5*lenth,inital_x+4.0*lenth,inital_y
+3.5*lenth);
line(inital_x+4.5*lenth,inital_y+0,inital_x+4.5*lenth,inital_y
+3.0*lenth);
line(inital_x+1.5*lenth,inital_y+0,inital_x+0,inital_y+1.5*lenth);
line(inital_x+2.5*lenth,inital_y+0,inital_x+1.0*lenth,inital_y
+1.5*lenth);
line(inital_x+3.5*lenth,inital_y+0,inital_x+2.0*lenth,inital_y
+1.5*lenth);
line(inital_x+4.5*lenth,inital_y+0,inital_x+3.0*lenth,inital_y
+1.5*lenth);
line(inital_x+4.5*lenth,inital_y+1.0*lenth,inital_x+3.0*lenth,inital_y
+2.5*lenth);
line(inital_x+4.5*lenth,inital_y+2.0*lenth,inital_x+3.0*lenth,inital_y
+3.5*lenth);
line(inital_x+4.5*lenth,inital_y+3.0*lenth,inital_x+3.0*lenth,inital_y
+4.5*lenth);
}
color(int inital_x,int inital_y,int lenth) /*FILL COLOR BY
THE DATA*/
{
int i,j;
int color_num;
int x1=inital_x+1.5*lenth;
int y1=inital_y+0.25*lenth;
int x2,y2;
for (i=0;i<3;i++)
{
x2=x1;
y2=y1;
for (j=0;j<3;j++)
{
color_num=top[i][j];
setfillstyle(1,color_num);
floodfill(x2,y2,WHITE);
x2=x2+lenth;
}
x1=x1-0.5*lenth;
y1=y1+0.5*lenth;
}
x1=inital_x+0.5*lenth;
y1=inital_y+2*lenth;
for (i=0;i<3;i++)
{
x2=x1;
y2=y1;
for (j=0;j<3;j++)
{
color_num=front[i][j];
setfillstyle(1,color_num);
floodfill(x2,y2,WHITE);
x2=x2+lenth;
}
y1=y1+lenth;
}
x1=inital_x+3.25*lenth;
y1=inital_y+2*lenth;
for (i=0;i<3;i++)
{
x2=x1;
y2=y1;
for (j=0;j<3;j++)
{
color_num=side[i][j];
setfillstyle(1,color_num);
floodfill(x2,y2,WHITE);
x2=x2+0.5*lenth;
y2=y2-0.5*lenth;
}
y1=y1+lenth;
}
}
arrow(int inital_x,int inital_y,int lenth) /*DRAWING THE
ARROW BY THE POSITION*/
{
if(position<=2)
{
line(inital_x-30,inital_y+2*lenth-3+position*lenth,inital_x-20,inital_y
+2*lenth-3+position*lenth);
line(inital_x-30,inital_y+2*lenth+3+position*lenth,inital_x-20,inital_y
+2*lenth+3+position*lenth);
line(inital_x-21,inital_y+2*lenth-6+position*lenth,inital_x-15,inital_y
+2*lenth+position*lenth);
line(inital_x-21,inital_y+2*lenth+6+position*lenth,inital_x-15,inital_y
+2*lenth+position*lenth);
}
if(position<=5&&position>2)
{
line(inital_x+0.5*lenth+(position-3)*lenth-3,inital_y+4.5*lenth
+30,inital_x+0.5*lenth+(position-3)*lenth-3,inital_y+4.5*lenth+20);
line(inital_x+0.5*lenth+(position-3)*lenth+3,inital_y+4.5*lenth
+30,inital_x+0.5*lenth+(position-3)*lenth+3,inital_y+4.5*lenth+20);
line(inital_x+0.5*lenth+(position-3)*lenth-6,inital_y+4.5*lenth
+21,inital_x+0.5*lenth+(position-3)*lenth,inital_y+4.5*lenth+15);
line(inital_x+0.5*lenth+(position-3)*lenth+6,inital_y+4.5*lenth
+21,inital_x+0.5*lenth+(position-3)*lenth,inital_y+4.5*lenth+15);
}
if(position>5)
{
line(inital_x+3.25*lenth+(position-6)*lenth*0.5-3+5,inital_y+4.5*lenth
+30-(position-5)*0.5*lenth+20,inital_x+3.25*lenth+
(position-6)*0.5*lenth-3+5,inital_y+4.5*lenth+20-(position-5)*0.5*lenth
+20);
line(inital_x+3.25*lenth+(position-6)*lenth*0.5+3+5,inital_y+4.5*lenth
+30-(position-5)*0.5*lenth+20,inital_x+3.25*lenth+
(position-6)*0.5*lenth+3+5,inital_y+4.5*lenth+20-(position-5)*0.5*lenth
+20);
line(inital_x+3.25*lenth+(position-6)*lenth*0.5-6+5,inital_y+4.5*lenth
+21-(position-5)*0.5*lenth+20,inital_x+3.25*lenth+
(position-6)*0.5*lenth+5,inital_y+4.5*lenth+15-(position-5)*0.5*lenth
+20);
line(inital_x+3.25*lenth+(position-6)*lenth*0.5+6+5,inital_y+4.5*lenth
+21-(position-5)*0.5*lenth+20,inital_x+3.25*lenth+
(position-6)*0.5*lenth+5,inital_y+4.5*lenth+15-(position-5)*0.5*lenth
+20);
}
}
copy (int *p,int *q)
{
int i,j;
for (i=0;i<3;i++)
{
for (j=0;j<3;j++)
{
*q=*p;
p++;
q++;
}
}
}
change1(int *p,int *q) /*CONVERT TWO
ARRAY*/
{
int i,ling;
p=p+sign;
q=q+sign;
if (temp[0]==0)
{
for(i=0;i<3;i++)
{
temp[i]=*p;
p=p+3;
}
p=p-9;
}
for(i=0;i<3;i++)
{
ling=*q;
*q=temp[i];
temp[i]=ling;
p=p+3;
q=q+3;
}
}
change2(int *p,int x) /*CHANGE THE
ARRAY BY REVERSE-CLOCKWISE*/
{
int i,j,k;
for (k=0;k<x;k++)
{
for(i=0;i<3;i++)
{
for(j=2;j>=0;j--)
{
new[j][i]=*p;
p=p+1;
}
}
p=p-9;
for (i=0;i<3;i++)
{
for (j=0;j<3;j++)
{
*p=new[i][j];
p++;
}
}
p=p-9;
}
}