24点问题的程序实现

来源:互联网 发布:张小西日本代购 知乎 编辑:程序博客网 时间:2024/05/16 11:30

题目:

24点用一笔连起来但只能用横线和竖线进行连接,最右边第二行的圆圈处不能用线进行连接

如图所示:

 

 

 

 

 

除第二行四个点外,每行五个点,共五行,圆圈处去掉一点

 

 

 

 

 

思路:用递归实现,设计一个递归函数tf()进行查找下一个节点并连接以第一行第一列的点为(1,1)第二行第一列为(2,1)编好每个点的坐标,在tf函数中先查找于自身节点相邻的且可以连接的点然后进行连接,然后就以此节点为寻找下一可用结点直到tf()函数返回0,就返回。

 

 

 

编程实现:(在tc2.0中编译通过)


#include<stdio.h>
#include<stdlib.h>
#include<graphics.h>
/*#include<windows.h>*/
#include <conio.h>
#include<dos.h>
int n=1,path[48];
int chack(int x1,int y1,int flag[6][6])
 {
     if(x1<=0||y1<=0||x1>5||y1>5||flag[x1][y1]==1)
   return 0;
  else
   return 1;
 }
int tf(int x1,int y1,int flag[6][6],int *n,int path[48])
{
 int a[8]={0,0,0,0,0,0,0,0};int biaoji=0,i;
 a[0]=x1-1;
 a[1]=y1;
 a[2]=x1;
 a[3]=y1-1;
 a[4]=x1+1;
 a[5]=y1;
 a[6]=x1;
 a[7]=y1+1;
 
 for (i=0;i<=3;i++)
 { 
  if(chack(a[2*i],a[2*i+1],flag))
  {
   flag[a[2*i]][a[2*i+1]]=1;
   /*printf("%d  %d||",a[2*i],a[2*i+1]);*/
                        path[2*(*n)]=a[2*i];
                        path[2*(*n)+1]=a[2*i+1];
                       setcolor(10);
                      
                       line(y1*30+10,x1*30+10,a[2*i+1]*30+10,a[2*i]*30+10);
                        *n=*n+1;
            sleep(0.1);
   if (!tf(a[2*i],a[2*i+1],flag,n,path))
   {
                           if(*n==24)
                           {biaoji=1;break;}
                           else
                           {
                           *n=*n-1;
                           path[2*(*n)]=0;
                          path[2*(*n)+1]=0;
                           flag[a[2*i]][a[2*i+1]]=0;
                          setcolor(0);
                         line(y1*30+10,x1*30+10,a[2*i+1]*30+10,a[2*i]*30+10);  
                     
    }
                     
             }else {biaoji=1;}
   
  }
 
 }
 if(biaoji==1)
  return 1;
 else
  return 0;

}
 
 void main()
 {      
        int j=1,i;
     int flag[6][6];
        int gdriver = DETECT, gmode, errorcode;
        
         initgraph(&gdriver, &gmode, "");
         errorcode = graphresult();
         if (errorcode != grOk)
         {
             printf("Graphics error: %s/n",
             grapherrormsg(errorcode));
              printf("Press any key to halt:");
              getch();
             exit(1);
         }
          path[0]=1;path[1]=5;
          setcolor(5);
           setlinestyle(1,1,1);
           setwritemode(0);          
           setfillstyle(SOLID_FILL, 5);
    for(i=1;i<6;i++)
    for(j=1;j<=5;j++)
    {     if(i!=2||j!=5)
                {
                 circle(j*30+10,i*30+10,3);
                 floodfill(j*30+10,i*30+10,5);
           flag[i][j]=0;
               }
    }
    flag[2][5]=1;flag[1][5]=1;
    if(tf(1,5,flag,&n,path))
    {
     printf("ok");
    }
    else
     printf("no");
          getch();
        closegraph();
 }

 

原创粉丝点击