题目描述:
小明参加了学校的趣味运动会,其中的一个项目是:跳格子。 地上画着一些格子,每个格子里写一个字,如下所示:
从我做起振
我做起振兴
做起振兴中
起振兴中华
比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。
要求跳过的路线刚好构成“从我做起振兴中华”这句话。
请你帮助小明算一算他一共有多少种可能的跳跃路线呢?
题目分析:
本题为非常典型的深搜问题,从左上方第一个顶点开始,遍历到右下方最后一个顶点即可。
【观察题干,其实每一个格子的位置都可以由他上面的格子或者是他左边的格子到达,比如g[3][2]可以从g[3][1]或者从g[2][2]直接到达,所以到达g[3][2]的方法数其实就等于到达g[3][1]的方法数与到达g[2][2]的方法数之和。看懂这个以后直接跳过代码1看代码2】
代码1如下(较为复杂):
public class _02振兴中华
{
private static int count=0;
public static void main(String[] args)
{
//标记每一个字从0开始到7
int [][] g=new int[4][5];
g[0][0]=0;
g[0][1]=1;
g[0][2]=2;
g[0][3]=3;
g[0][4]=4;
g[1][0]=1;
g[1][1]=2;
g[1][2]=3;
g[1][3]=4;
g[1][4]=5;
g[2][0]=2;
g[2][1]=3;
g[2][2]=4;
g[2][3]=5;
g[2][4]=6;
g[3][0]=3;
g[3][1]=4;
g[3][2]=5;
g[3][3]=6;
g[3][4]=7;
dg(g,0,0,0);
System.out.println(count);
}
static void dg(int[][] g, int n, int a, int b)
{
if(n==7)//找到了最后一个字
{
count++;//方法数+1
return;
}
if(a<=3&&a>=0&&b<=4&&b>=0)//防止越界
{
//向右方寻找
if(b+1<=4&&g[a][b+1]==g[a][b]+1)//此处表示寻找到了正确的下一个字,即“从”后的下一个字为“我”,“我”后的下一个字为“做”,以此类推
dg(g,n+1,a,b+1);
//向下方寻找
if(a+1<=3&&g[a+1][b]==g[a][b]+1)//此处同上
dg(g,n+1,a+1,b);
}
}
}
在方法1中,考虑到了每个汉字的顺序问题,因此显得较为复杂,但是观察题干可以发现,其实考虑顺序是没什么卵用的,因为不管你向上或者向下走,其实都是会按照相应的顺序走的,所以这个方法就显得很蠢。
于是有了下面这个牛逼的代码
代码2如下:
public class _02振兴中华
{
public static void main(String[] args)
{
System.out.println(j(0,0));
}
static int j(int i, int j)
{
if(i==3||j==4) return 1;//只要到达了边界,那么就产生了一个正确解
return j(i+1,j)+j(i,j+1);
}
}
这个的解析在题目分析里面。