Description
正如人们喜欢玩游戏“跳房子”一样,农夫John的奶牛也发明了一些适合它们玩的“跳房子”游戏。尽管这些重达
近一吨的笨拙动物玩游戏总是以灾难结束,但这并不妨碍它们每天下午玩游戏的热情。这个游戏在一个R*C的网格
(2≤R≤15,2≤C≤15)中进行,其中每一个方格是红色或者蓝色。奶牛一开始在左上角的格子中,通过一系列有
效的跳跃,移动到右下角格子中。一个跳跃是有效的,当且仅当
1)你跳跃到与之前所站不同颜色的格子中,
2)你要跳跃到的格子在你现在所站格子的下方至少一行的位置,
3)你要跳跃到的格子在你现在所站格子的右边至少一列的位置。
请帮助奶牛们计算它们有多少种方法可以从左上角格子跳跃到右下角格子。
Input
第一行包含两个整数R和C。后面R行每行包含C个字符。每一个字符是“R”或“B”,表示一个红色或蓝色格子。
Output
输出从左上角格子跳跃到右下角格子的不同方法数量。
Sample Input
4 4
RRRR
RRBR
RBBR
RRRR
Sample Output
3
HINT
Source
Bronze DFS
这题难就难在搜索那一步,我们其实可以用两个for循环来搜索,这样就可以找到下一个可跳的点了。
想想其实也不难
下面看代码:
#include <bits/stdc++.h> //头文件
using namespace std;
int n,m,ans=0;
char a[18][18]; //存地图
void dfs(int x,int y,char s) {
if(x>n||y>m||x<=0||y<=0) {
return ;
}
if(x==n&&y==m) { //到达终点
ans++;
return ; //剪枝,既然已经到了就不需要搜索了
}
for(int i=x+1; i<=n; i++) { //这两个循环是用来搜索下一个点跳在哪的
for(int j=y+1; j<=m; j++) {
if(a[i][j]!=s) { //找到了可跳的点
dfs(i,j,a[i][j]);
}
}
}
}
int main() {
cin>>n>>m;
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
cin>>a[i][j];
}
}
dfs(1,1,a[1][1]);
cout<<ans<<endl;
return 0;
}