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;
}
}
}