📄 kanoi.c
字号:
/*编译环境:tuboc2.0*/
/*编译方法:在桌面建一TC.exe的快捷方式,将程序拖入快捷方式编译执行即可*/
#define NULL '\0'
#include<stdlib.h>
#include<math.h>
#include<dos.h>
#include<conio.h>
#include<graphics.h>
#include<stdio.h>
#define S(a,b) a^b
#define VIDEO 0x33
union REGS reg; /*鼠标寄存器设定*/
int cp=0; /*A,B,C,D输出计数器cp*/
int count=0; /*多结果计数器count*/
char **group[6],*key[80];
/*0:1的个数;1-8:组合记录;9:相同位标志;10-13:输入最小项二进制表*/ /*---------------------输入控制---------------------------*/
char kive[16]={0};
int recorder[4][4];
struct stack
{char array[150];
int top;
}S;
int empty(struct stack *p)
{if ((*p).top==-1) return (1);
else return (0);
}
void initstack(struct stack *p)
{ (*p).top=0;return;}
void push(char ch,struct stack *p)
{int k;
if((*p).top>=150) {printf("The stack is overflowing.....\n");exit(0);}
else {k=(*p).top;(*p).top=(*p).top+1;(*p).array[k]=ch;}return;
}
char pop(struct stack *p)
{int k;
if((*p).top==-1) {printf("There is no contentment.....\n");exit(0);}
else {(*p).top=(*p).top-1;k=(*p).top;}return((*p).array[k]);
}
char gettop(struct stack *p)
{int k;
k=(*p).top;
return((*p).array[k]);
}
struct stack *store;
/*==============================字符输入处理===================================*/
void input(void)
{
char ch;
int i,j,sum=0,pause=0,change[4]={-1,-1,-1,-1},r[8]={0};
while(!empty(store))
{ ch=pop(store);pause=0;
while((ch!='+')&&(!empty(store)))
{switch(ch)
{case 'A':{change[0]=8;if (pause) {change[0]=0;pause=0;}}break;
case 'B':{change[1]=4;if (pause) {change[1]=0;pause=0;}}break;
case 'C':{change[2]=2;if (pause) {change[2]=0;pause=0;}}break;
case 'D':{change[3]=1;if (pause) {change[3]=0;pause=0;}}break;
case '\x27':pause=1;break;
default:break;
}
ch=pop(store);
}
for(i=0;i<8;i++)r[i]=0;
for(i=0;i<4;i++) /*LEAK*/
if(change[i]!=-1)
{for(j=0,sum=0;j<4;j++)
{
if(change[j]!=-1)
{sum=sum+change[j];change[j]=0;}
else change[j]=pow(2,3-j);
}
kive[sum]='*';
r[0]=sum+change[3]; r[1]=r[0]+change[2];/*转换器*/
r[2]=r[0]+change[1];r[3]=r[1]+change[1];
r[4]=r[0]+change[0];r[5]=r[1]+change[0];
r[6]=r[2]+change[0];r[7]=r[3]+change[0];
for(j=0;j<8;j++)
{pause=r[j];kive[pause]='*';}
if(r[0]!=sum)
{for(j=0;j<8;j++)
if(r[j]>sum) kive[r[j]-1]='*';
}
for(j=0;j<4;j++) change[j]=-1;break;
}
}
}
/*===============================图形区域位置检索=================================*/
void far search(int n,int *x,int *y)
{
switch(n) /*图形起始位置(45,75)*/
{case 0:{*x=65;*y=95;break;}
case 1:{*x=145;*y=95;break;}
case 2:{*x=305;*y=95;break;}
case 3:{*x=225;*y=95;break;}
case 4:{*x=65;*y=175;break;}
case 5:{*x=145;*y=175;break;}
case 6:{*x=305;*y=175;break;}
case 7:{*x=225;*y=175;break;}
case 8:{*x=65;*y=335;break;}
case 9:{*x=145;*y=335;break;}
case 10:{*x=305;*y=335;break;}
case 11:{*x=225;*y=335;break;}
case 12:{*x=65;*y=255;break;}
case 13:{*x=145;*y=255;break;}
case 14:{*x=305;*y=255;break;}
case 15:{*x=225;*y=255;break;}
}
}
/*cccccccccccccccccccccccc清除画图区内容cccccccccccccccccccccccccccccc*/
void far clear(void)
{
int i,j;
for(i=0;i<16;i++)kive[i]=-1;
setfillstyle(1,LIGHTBLUE);
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
bar(46+80*i,76+80*j,124+80*i,154+80*j);
} /*清理画图区*/
setfillstyle(1,BLUE); /*清理函数标记区*/
for(i=0;i<16;i++)
bar(522,101+15*i,534,114+15*i);
cp=0; /*复位输出计数器cp*/
moveto(0,0);
}
/*=========================画线函数===================================*/
void rectline(int x,int y,char direction,char length,int color)
{
int i;
switch(direction)
{case 'u':{if(length=='L') for(i=y;i>=y-80;i--) /*边框起始点(45,75)*/
{
if(i<=75){putpixel(x,325+i,color);delay(0);}
else {putpixel(x,i,color);delay(0);}
}
if(length=='S') for(i=y;i>=y-40;i--){putpixel(x,i,color);delay(0);}break;
}
case 'd':{if(length=='L') for(i=y;i<=80+y;i++)
{if(i>=400) {putpixel(x,i-325,color);delay(2000);}
else {putpixel(x,i,color);delay(0);}}
if(length=='S') for(i=y;i<=40+y;i++)
{putpixel(x,i,color);delay(0);}break;
}
case 'l':{if(length=='L') for(i=x;i>=x-80;i--)
{if(i<=45) {putpixel(325+i,y,color);delay(0);}
else {putpixel(i,y,color);delay(0);}
}
if(length=='S') for(i=x;i>=x-40;i--)
{putpixel(i,y,color);delay(0);}break;
}
case 'r':{if(length=='L') for(i=x;i<=80+x;i++)
{if(i>=370) {putpixel(i-325,y,color);delay(0);}
else {putpixel(i,y,color);delay(0);}}
if(length=='S') for(i=x;i<=40+x;i++)
{putpixel(i,y,color);delay(0);}break;
}
case 's':{if(length=='r') for(i=x;i<x+121;i++)
if(i>=367)
{putpixel(i-322,y,color);delay(0);}
else{putpixel(i,y,color);delay(0);}
if(length=='u') for(i=y;i>=y-121;i--)if(i<=75)
{putpixel(x,i+322,color);delay(0);}
else{putpixel(x,i,color);delay(0);}
}
if(length=='d') for(i=y;i<y+121;i++)if(i>=395)
{putpixel(x,i-322,color);delay(0);}
else {putpixel(x,i,color);delay(0);}
if(length=='l') for(i=x;i>=x-121;i--)if(i<=45)
{putpixel(i+322,y,color);delay(0);}
else {putpixel(i,y,color);delay(0);}break;
}
}
/*--------------------------画-----线-----调------整---------------------------*/
void graph(int color)
{ char *p;
int i,j,n=0,*x0,*y0,*x1,*y1,x=0,y=0,a=0,b=0,min,max;
for(i=0;i<=16;i++)
{
if(key[i]!=NULL)
{if(*(key[i]+9)=='@')*(key[i]+9)=-1;
else
{p=key[i];min=max=*(++p); /*n找出每组包含的最小项个数*/
for(j=1,n=0;j<=8;j++,p++)
{if (*p!=-1){if(*p>max)max=*p;if(*p<min)min=*p;n++;}}
x0=&a;y0=&b;x1=&x;y1=&y;
search(min,x0,y0);search(max,x1,y1);
switch(n)
{case 2:{if(fabs(a-x)==80) /*两个一组的画图*/
{if(a>x){a=x;b=y;}
rectline(a,b,'s','r',color);rectline(a+120,b,'d','S',color);
rectline(a+120,b+40,'s','l',color);rectline(a,b+40,'u','S',color);}
if(fabs(a-x)==240)
{a=x;b=y;
rectline(a,b,'s','r',color);rectline(a-200,b,'d','S',color);
rectline(a-200,b+40,'s','l',color);rectline(a,b+40,'u','S',color);
}
if(fabs(b-y)==80)
{if(b>y){a=x;b=y;}
rectline(a,b,'r','S',color);rectline(a+40,b,'s','d',color);
rectline(a+40,b+120,'l','S',color);rectline(a,b+120,'s','u',color);
}
else if(fabs(b-y)==240)
{a=x;b=y;
rectline(a,b,'r','S',color);rectline(a+40,b,'s','d',color);
rectline(a+40,b-200,'l','S',color);rectline(a,b-200,'s','u',color);
}break;
}
case 4:{if((fabs(a-x)==80)&&(fabs(b-y)==80)) /*四个一组的画图*/
{if((a>x)&&(b>y)){a=x;b=y;}if(a>x)a=x;if(b>y)b=y;
rectline(a,b,'s','r',color);rectline(a+120,b,'s','d',color);
rectline(a+120,b+120,'s','l',color),rectline(a,b+120,'s','u',color);
}
if((fabs(a-x)==80)&&(fabs(b-y)==240))
{if(a>x)a=x;rectline(a,b+40,'s','r',color);rectline(a+120,b+40,'s','u',color);
rectline(a+120,b+240,'s','l',color);rectline(a,b+240,'s','d',color);
}
if((fabs(a-x)==240)&&(fabs(b-y)==80))
{if(b>y)b=y;
rectline(a+40,b,'s','l',color);rectline(a+240,b,'s','d',color);
rectline(a+240,b+120,'s','r',color);rectline(a+40,b+120,'s','u',color);
}
if((fabs(a-x)==240)&&fabs(b-y)==240)
{rectline(x,y,'s','r',color);rectline(x-200,y,'s','d',color);
rectline(a+40,b+40,'s','l',color);rectline(a+240,b+40,'s','u',color);
}
if(fabs(a-x)==160)
{for(j=0;j<3;j++)rectline(a+80*j,b,'r','L',color);
rectline(a+240,b,'r','S',color);rectline(a+280,b,'d','S',color);
for(j=3;j>0;j--)rectline(a+40+80*j,b+40,'l','L',color);
rectline(a+40,b+40,'l','S',color);rectline(a,b+40,'u','S',color);
}
if(fabs(b-y)==160)
{rectline(a,b,'r','S',color);rectline(a+40,b,'d','S',color);
for(j=0;j<3;j++)rectline(a+40,b+40+j*80,'d','L',color);
rectline(a+40,b+280,'l','S',color);rectline(a,b+280,'u','S',color);
for(j=3;j>0;j--)rectline(a,b+80*j,'u','L',color);
}break;
}
case 8:{if((fabs(b-y)==80)) /*八个一组的画图*/
{if(b>y)b=y;
for(j=0;j<3;j++)rectline(a+80*j,b,'r','L',color);
rectline(a+240,b,'r','S',color);rectline(a+280,b,'s','d',color);
for(j=3;j>0;j--)rectline(a+40+80*j,b+120,'l','L',color);
rectline(a+40,b+120,'l','S',color);rectline(a,b+120,'s','u',color);
}
if(fabs(a-x)==80)
{if(a>x)a=x;
rectline(a,b,'s','r',color);rectline(a+120,b,'d','S',color);
for(j=0;j<3;j++)rectline(a+120,b+40+80*j,'d','L',color);
rectline(a+120,b+280,'s','l',color);rectline(a,b+280,'u','S',color);
for(j=3;j>0;j--)rectline(a,b+80*j,'u','L',color);
}
if((fabs(a-x)==160)&&(fabs(b-y)==240))
{for(j=0;j<3;j++)rectline(a+80*j,b+40,'r','L',color);
rectline(a+240,b+40,'r','S',color);rectline(a+280,b+40,'s','u',color);
for(j=3;j>0;j--)rectline(a+40+80*j,b+240,'l','L',color);
rectline(a+40,b+240,'l','S',color);rectline(a,b+240,'s','d',color);
}
if((fabs(a-x)==240)&&(fabs(b-y)==160))
{rectline(a+40,b,'s','l',color);rectline(a+240,b,'d','S',color);
for(j=0;j<3;j++)rectline(a+240,b+40+80*j,'d','L',color);
rectline(a+240,b+280,'s','r',color);rectline(a+40,b+280,'u','S',color);
for(j=3;j>0;j--)rectline(a+40,b+80*j,'u','L',color);
}break;
}
default:break;
} /*put a kive and line the rectangle*/
}
}
}
}
/*=====================================图形框架====================================*/
void Frame_kive(void)
{
int i,j,k,n;char put[16][4];
clear();
settextstyle(0,HORIZ_DIR,1);
settextjustify(LEFT_TEXT,0);
moveto(20,50);line(20,50,45,75); /*设计边框的外围*/
moveto(35,61);outtext("CD");
moveto(20,65);outtext("AB");
moveto(45,68);outtext(" 00 01 11 10 ");
moveto(29,112);outtext("00");
moveto(29,191);outtext("01");
moveto(29,270);outtext("11");
moveto(29,351);outtext("10");
for(i=0;i<5;i++) line(45,75+80*i,365,75+80*i);
for(i=0;i<5;i++) line(45+80*i,75,45+80*i,395);
moveto(630,475),outtext("\x22");
moveto(440,75);line(440,95,560,95);line(515,75,515,340);
setcolor(CYAN);outtextxy(440,85,"A B C D F");
moveto(440,105);setcolor(LIGHTGREEN);
for(i=0;i<16;i++)
{n=i;
for(j=0;j<4;j++)
{k=pow(2,3-j);put[i][j]=n/k;if(n>=k) n-=k;}
}
for(i=0;i<16;i++)
for(j=0;j<4;j++)
{moveto(440+16*j,112+15*i);
if(put[i][j]==0)outtext("\x30");
if(put[i][j]==1)outtext("\x31");
}
setcolor(BLUE);
setfillstyle(1,LIGHTCYAN);
ellipse(600,25,0,360,30,20);
floodfill(620,25,BLUE);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,1);
settextjustify(CENTER_TEXT,CENTER_TEXT);
setcolor(YELLOW);
outtextxy(600,23,"exit");
for(i=0;i<5;i++)
{
setfillstyle(i+2,i+3);
bar(370+48*i,355,410+48*i,395);
} /*draw the buttons*/
bar(370,400,410,440);
setfillstyle(1,LIGHTCYAN);
for(i=0;i<5;i++) bar(375+48*i,360,405+48*i,390);
bar(375,405,405,435);
setcolor(5); /*put A,B,C,D,+*/
settextstyle(GOTHIC_FONT,HORIZ_DIR,5);
settextjustify(LEFT_TEXT,0);
outtextxy(375,390,"A B C D '");
outtextxy(378,431,"+");
setfillstyle(7,RED);
bar(514,400,602,440); /*put finished*/
setfillstyle(8,CYAN);
bar(519,405,597,435);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,2);
settextjustify(CENTER_TEXT,CENTER_TEXT);
setcolor(LIGHTRED);
outtextxy(558,420,"finished");
setfillstyle(1,RED); /*put clear*/
bar(420,400,506,440);
setfillstyle(1,CYAN);
bar(425,405,500,435);
settextstyle(TRIPLEX_FONT,HORIZ_DIR,2);
settextjustify(CENTER_TEXT,CENTER_TEXT);
setcolor(LIGHTRED);
outtextxy(463,420,"clear");
settextstyle(TRIPLEX_FONT,HORIZ_DIR,5);/*title*/
settextjustify(CENTER_TEXT,CENTER_TEXT);
outtextxy(320,25,"KANOI GRAPH");
setcolor(6);
for(i=0;i<16;i++) /*draw the fuction label buttons*/
rectangle(521,100+15*i,535,115+15*i);
setfillstyle(1,LIGHTBLUE); /*set the area of output content*/
bar(45,420,365,470);
settextstyle(0,0,0); /*recover the text mode*/
settextjustify(LEFT_TEXT,0);
outtextxy(45,420,"output:");printf("\n");
setcolor(LIGHTRED);
for(i=0;i<16;i++) /*label the function*/
if(kive[i]=='*') {outtextxy(525,113+15*i,"1");}
return;
}
/*============================整理是最小项排列规则==============================*/
void sort(int *flagfile)
{
int i,n=0,k=0,flag=0;char **p,**head,*temp;
head=key;group[0]=head;
for(i=0;i<6;i++)
{for(p=head;p<key+80;p++)
if(*p!=NULL)
if(**p==i){temp=*p;*p=*head;*head=temp;k++;flag=1;head++;}
if(flag){group[n]=head-k;n++;k=0;flag=0;}
}
group[n]=head;for(p=head;p<key+80;p++)*p=NULL;
if(**group[n-1]>=1) *flagfile=1;
}
/*============================化简以至平衡=======================================*/
void balance(int *flagfile)
{int i,j,k,n=0,search=0,compare=0,temp;
char **p,**q,**r,*head,**border,queue[14];
while(*group[search]!=NULL)search++;border=group[search];r=border;search=0;r++;
while((n<4)&&(group[n+2]!=NULL))
{for(i=0,p=group[n];i<(&*group[n+1]-&*group[n]);i++,p++)
{for(j=0,q=group[n+1];j<(&*group[n+2]-&*group[n+1]);j++,q++)
{
for(k=0,compare=0;k<4;k++)
{temp=S((*(*p+10+k)),(*(*q+10+k)));compare=compare+temp;}
if(compare==1)
{*flagfile=1;
head=malloc(sizeof(queue));for(k=0;k<14;k++) *(head+k)=*(*q+k);
for(k=0;k<4;k++) {temp=S((*(*p+10+k)),(*(head+10+k)));if(temp==1) *(head+9)=k;}
*(*p+9)=1;*(*q+9)=1; /*记录标记内容*/
for(k=1;k<=8;k++)
if(*(*p+k)!=-1) /*内容拷贝*/
{search=1;while(*(head+search)!=-1)search++;*(head+search)=*(*p+k);}
else break;
while(*r!=NULL)r++;*r=head;
} /*将可化简的2项放置于一项*/
}
}n++;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -