题目:
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();
}