【题目】
标题: 振兴中华
小明参加了学校的趣味运动会,其中的一个项目是:跳格子。
地上画着一些格子,每个格子里写一个字,如下所示:(也可参见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]);
}
}