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

📄 kanoi.c

📁 编译环境:tuboc2.0 编译方法:在桌面建一TC.exe的快捷方式
💻 C
📖 第 1 页 / 共 2 页
字号:
/*编译环境: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 + -