程序帮我解答了一道无法很有说服力用手算证明的题目

今天在逛网页的时候,无意中看到了一道比较有趣的题目。首先来介绍该题吧,

        在上图中,从任意的白点出发,寻找一天通过每一个白点一次的路径,要求不能经过黑点,路径经过所有的白点,且在一个白点时,只能从它上下左右有白点的位置经过,不能斜着走。当时看到这个题目的时候,自己还傻傻的在那画了很久,结果发现不管怎么画也画不出来,自己还分析出,左上角第一个点,必定是路径的一个端点,这样来画出了好几种情形,发现无论怎么走都做不出来。觉得没有解,但是由于用手画图,又不能画出所有的情况,因此,也不能很有说服力的证明该题是没有解的。

        于是想到了不如写一个程序来解这道题目吧。我采用的是动态规划的方法来求解,采用从左上角那个白点开始(因为前面分析,该点必定是路径的一个端点),用递归的方法寻找所有的合法路径,看是否存在一条铺满所有白点的路径。并且在递归深入的过程中,使用了分支界限的原则,只对合法路径节点进行深入。

        程序的基本思想是,从左上角那个白点开始,每次走下一步的白点,通过递归函数实现,向下递归的条件是,下一步的白点时一个合法的白点,在前面的路径中没有走过,且位于当前白点的上下左右四个方位之一。这样每次走的一步都是合法的白点。函数退出的条件,要么是无法继续走下一个白点,要么是找到了一条铺满所有白点的路径。

下面是程序运行的结果,该到题目的解也在其中(另外我给这个程序取了一个有趣的名字!):


程序源代码:

#include <stdio.h>
int B_i=0,B_j=1;
int C[24][2];
int findaway=0;
int whetherIn(int i,int j,int k)
{
int flag=0,m=0;
for (m=0;m<=k;m++)
{
if (C[m][0]==i && C[m][1]==j)
{
flag =1;
break;
}
}
return flag;


}
int findNextStep(int i,int j,int k)
{
C[k][0]=i;
C[k][1]=j;
if(k==23)
findaway += 1;
if (i+1 != B_i && i<4 && !whetherIn(i+1,j,k))
{
findNextStep(i+1,j,k+1);
}
if (i-1 != B_i && i>0 && !whetherIn(i-1,j,k))
{
findNextStep(i-1,j,k+1);
}
if (j+1 != B_j && j<4 &&  !whetherIn(i,j+1,k))
{
findNextStep(i,j+1,k+1);
}
if (j-1 != B_j && j>0 && !whetherIn(i,j-1,k))
{
findNextStep(i,j-1,k+1);
}


}
int main()
{
findNextStep(0,0,0);
if (findaway)
{
printf("GamaCat said: Exit %d way\n",findaway);
}
else
{
printf("GamaCat said: Not exit a way\n");
}
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值