【题目】
标题: 振兴中华
小明参加了学校的趣味运动会,其中的一个项目是:跳格子。
地上画着一些格子,每个格子里写一个字,如下所示:(也可参见p1.jpg)
从我做起振
我做起振兴
做起振兴中
起振兴中华
比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。
要求跳过的路线刚好构成“从我做起振兴中华”这句话。
请你帮助小明算一算他一共有多少种可能的跳跃路线呢?
答案是一个整数,请通过浏览器直接提交该数字。
注意:不要提交解答过程,或其它辅助说明类的内容。
解法一:神搜
package codeforces; import java.util.*; public class Main937B { static int n=5,m=4; static int a[][]=new int[6][6]; static int vis[][]=new int[6][6]; static int cnt=0; static int dir[][]= {{1,0},{0,1},{-1,0},{0,-1}}; public static void main(String[] args){ solve(); } public static void solve() { Scanner sc=new Scanner(System.in); for(int i=1;i<=4;i++) for(int j=1;j<=5;j++) { a[i][j]=i+j-1; vis[i][j]=0; } dfs(1,1); System.out.println(cnt); } public static void dfs(int row,int col) { vis[row][col]=1; if(a[row][col]==8)cnt++; for(int i=0;i<4;i++) { int dx=row+dir[i][0]; int dy=col+dir[i][1]; if(dx<1||dy<1||dx>4||dy>5)continue; else { if(vis[dx][dy]==0&&a[dx][dy]-a[row][col]==1) { vis[dx][dy]=1; dfs(dx,dy); vis[dx][dy]=0; } } } } }
解法二:
动态规划:
public class ZhenXingZhongHua { public static void main(String[] args) { int[][] a = new int[4][5]; int i; int j; for (i = 0; i < 4; i++) for (j = 0; j < 5; j++) { if (i == 0 || j == 0) a[i][j] = 1; } a[0][0] = 0; for (i = 1; i < 4; i++) { for (j = 1; j < 5; j++) a[i][j] = a[i - 1][j] + a[i][j - 1]; } System.out.println(a[3][4]); } }
解法三:数学(排列组合)
C(7,3) 理由: 首先到达终点必须要走七步,在这七步里一定有四步是横着走,三步竖着走,顺序随。从七步里任选3步横向走,因此有c(7,3)种可能
变形题:
变型题: .从20*20的网格的左上角通往右下角有多少条路? 从一个2*2网格的左上角开始,有6条(不允许往回走)通往右下角的路。 对于20*20的网格,这样的路有多少条? 其实就是和上面的比较类似: 个人认为20*20的表格应该是21*21的数据进行解答。 代码如下: public class ZhenXingZhongHuaBianXing { public static void main(String[] args) { int[][] a=new int[21][21]; for (int i = 0; i < a.length; i++) { for (int j = 0; j < a[i].length; j++) { if(i==0||j==0){ a[i][j]=1; } } } a[0][0]=0; for (int i = 1; i < a.length; i++) { for (int j = 1; j < a[i].length; j++) { a[i][j]=a[i-1][j]+a[i][j-1]; } } System.out.println(a[20][20]); } }