1.题目 振兴中华
小明参加了学校的趣味运动会,其中的一个项目是:跳格子。
地上画着一些格子,每个格子里写一个字,如下所示:(也可参见p1.jpg)
从我做起振
我做起振兴
做起振兴中
起振兴中华
比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。要求跳过的路线刚好构成“从我做起振兴中华”这句话。
2.思路:站在一个点,选择下一个点。
递归,遍历整个图,类似于深度搜索。
3.解题:
方法一:【此题的特殊性,”从“的右侧和下一行的字一定是“我”的规律】
一个点的可以走的方法等于 该行下一列的的下一步方法+该点同列下一行下一步的方法(递归思想)
整个格子看成一个二维数组a[i][j],由于本题只能向右或向下,当边界时j=4或i=3时,只有一种走法(只能向下、只能向右)
package shengsai;
public class zhenxing03 {
public static void main(String args[])
{
//重复
//变化
//边界
int ans=f(0,0);
System.out.print(ans);
}
public static int f(int i,int j)
{
if(i==3||j==4) return 1;
return f(i+1,j)+f(i,j+1);
}
}
方法二:【普遍做法:走完一条路线要验证是不是”从我做起振兴中华“这句话】
package shengsai;
public class zhenxing03 {
public static char [][] a= {{'从','我','做','起','振'},
{'我','做','起','振','兴'},
{'做','起','振','兴','中'},
{'起','振','兴','中','华'}};
public static int count=0;
public static void main(String args[])
{
char []b=new char [8];
jump(0,0,0,b);
System.out.println(count);
}
public static void jump(int x,int y,int step,char[] b)
{
if(x>3)return;
if(y>4)return;
if(step>7)return ;
b[step]=a[x][y];
if(step==7) {
if(check(b))
{
count++;
}
return;}
jump(x+1,y,step+1,b);
jump(x,y+1,step+1,b);
}
public static boolean check(char[] b)
{
if("从我做起振兴中华".equals(String.valueOf(b)))
{
return true;
}else
{
return false;
}
}
}