题目
在平面上有一些二维的点阵 这些点的编号就像二维数组的编号一样,从上到下依次为第1至第n行,从左到右依次为第1至第m行,每一个点可以用行号和列号来表示。 现在有个人站在第一行第一列,要走到第n行第m列。只能向右或者向下走。 注意:如果行号和列号都是偶数,不能走入这一格中。 问有多少种方案。代码如下
package com.hzc.bluecap;
import java.util.Scanner;
public class BlueCap20208 {
private static Integer m;
private static Integer n;
private static Integer sum;
private static int[][] arr;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
m=sc.nextInt();
n=sc.nextInt();
arr=new int[m][n];
// for (int i = 1; i <=30; i++) {
// for (int j = 1; j <= 30; j++) {
// m=i;
// n=j;
// sum=0;
// dfs(1,1);
// System.out.print(sum+"\t");
// }
// System.out.println();
// }
dfs2();
System.out.println(sum);
System.out.println(arr[m-1][n-1]);
}
private static void dfs(int i, int j) {
// TODO Auto-generated method stub
if(i>m||j>n) {
return;
}
if(i%2==0&&j%2==0) {
return;
}
if(i==m&&j==n) {
sum++;
return;
}
dfs(i+1,j);
dfs(i,j+1);
}
public static void dfs2() {
for(int i = 0;i<m;i++) {
for(int j=0;j<n;j++) {
if(i==0||j==0) {
arr[i][j]=1;
}else if(i%2==1&&j%2==1) {
arr[i][j]=0;
}else {
arr[i][j]=arr[i-1][j]+arr[i][j-1];
}
}
}
}
}
思路
1.看到每一步都只有两种走法想到递归的方法
2.用判断剔除特殊情况并终止,成功时sum++;
优化思路
1.输出符合条件的每一个结果寻找规律
2.发现arr[i][j]=arr[i-1][j]+arr[i][j-1],将其他特殊位置进行赋值
可得到arr[m-1][n-1](结果)