题目描述
就像人喜欢玩跳房子一样,农夫约翰的牛也发明了一种供他们玩耍的变种跳房子。
虽然这些重量接近一吨的笨重生物每次玩跳房子都会让牛棚遭受灾难性的破坏,但是奶牛们仍然乐此不疲的每天下午坚持游戏。
游戏在一个 R×C的方格矩阵中进行,其中每个方格都用蓝色或红色进行着色。
奶牛从左上角的方格开始,通过一系列跳跃移动到右下角的方格结束。
奶牛在跳跃时,需满足:
- 将要跳入的格子的颜色必须与当前所在格子的颜色不同。
- 将要跳入的格子的所在行必须在当前所在格子的所在行的下方。
- 将要跳入的格子的所在列必须在当前所在格子的所在列的右方。
请帮助奶牛计算它们共有多少种不同的跳法,可以从左上角跳到右下角。
输入格式
第一行包含两个整数 R,C
接下来 R 行,每行包含 C 个字符,每个字符为 R(表示红色)或者 B(表示蓝色)。
输出格式
输出从左上角跳到右下角的不同跳法的数量。
数据范围
2≤R,C≤15
输入样例:
4 4
RRRR
RRBR
RBBR
RRRR
输出样例:
3
题目分析
某一个点,只能由其左上方的点跳转来,且需颜色不同
看到这里,想到了DP动态规划 和 DFS算法, 我用了DP
思路如下:
状态转移方程 即能跳转到 i, j 点的路线的总和
初始化: 把dp数组的第一行和第一列设为0, dp[0][0](起点)设为 1
代码实现
import java.util.*;
import java.io.*;
public class Main{
static int N = 20;
static int[][] dp = new int[N][N];
static String[] s;
static char[][] ch = new char[N][N];
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
s = br.readLine().split(" ");
int r = Integer.parseInt(s[0]);
int c = Integer.parseInt(s[1]);
for(int i = 0; i < r; i ++)
ch[i] = br.readLine().toCharArray();
//初始化
for(int i = 1; i < c; i ++)
dp[0][i] = 0;
for(int i = 1; i < r; i ++)
dp[i][1] = 0;
dp[0][0] = 1;
for(int i = 1; i < r; i ++) //列举每一行
for(int j = 1; j < c; j ++) // 列举每一列
for(int k = 0; k < i; k ++) //列举在 i 上方的 每一行
for(int p = 0; p < j; p ++){ // 列举在 j 左方的 每一列
if(ch[k][p] != ch[i][j]){ //判断两个坐标颜色是否相等
dp[i][j] += dp[k][p]; //状态转移
}
}
// r - 1, c - 1为右下角坐标
System.out.println(dp[r - 1][c - 1]);
}
}