java算法练习_JAVA 算法练习(二)

本文介绍了两种机器人走方格问题的解法,包括无障碍和有障碍的情况。采用动态规划策略,通过逐层累加计算从左上角到右下角的不同路径数量。对于有障碍的网格,通过处理上边界与左边界的方格来排除不可行路径。代码示例清晰展示了算法实现过程。
摘要由CSDN通过智能技术生成

和上次一样,虽说用 java 语言,但有 c 的基础一样可以看懂哦。

机器人走方格问题Ⅰ

题目概述

有一个XxY的网格,一个机器人只能走格点且只能向右或向下走,要从左上角走到右下角。请设计一个算法,计算机器人有多少种走法。给定两个正整数int x,int y,请返回机器人的走法数目。保证x+y小于等于12。

测试样例:

2,2

返回:2

解析

不知道大家记得之前的dfs与bfs吗?这是那种类型题目的求通路数问题。我们之前要求求得到达目的地的最短路程,现在则求有多少条路可达目的地。

解题方法我觉得像是逐层累加,稍后大家利用表格还原代码过程就可以明白了。

代码如下:

public class Text7 {

public int countWays(int x, int y) {

int[][] dp = new int[x][y];

dp[0][0] = 1;

for (int i = 1; i < x; i++) {

dp[i][0] = dp[i-1][0];

}

for (int i = 1; i < y; i++) {

dp[0][i] = dp[0][i-1];

}

for (int i = 1; i < x; i++) {

for (int j = 1; j < y; j++) {

dp[i][j] = dp[i-1][j] + dp[i][j-1];

}

}

return dp[x-1][y-1];

}

}

大家画图表推演下就懂了。

机器人走方格问题Ⅱ

题目概述

有一个XxY的网格,一个机器人只能走格点且只能向右或向下走,要从左上角走到右下角。请设计一个算法,计算机器人有多少种走法。注意这次的网格中有些障碍点是不能走的。

给定一个int[][] map(C++ 中为vector >),表示网格图,若map[i][j]为1则说明该点不是障碍点,否则则为障碍。另外给定int x,int y,表示网格的大小。请返回机器人从(0,0)走到(x - 1,y - 1)的走法数,为了防止溢出,请将结果Mod 1000000007。保证x和y均小于等于50。

解析

这道有障碍的就更像之前的题了。总体思路和上题相同,但是要处理障碍物。根据左上角到右下角总体方向且只能向右或向下走,可以得知除上边界与左边界的方格外,其它方格可以不用处理。

大家想一想为什么要处理上边界与左边界的方格,该怎么处理呢?

代码如下:

public class Robot {

public int countWays(int[][] map, int x, int y) {

for (int i = 0; i < x; i++) {

if (map[i][0] == 0) {

for (int j = i; j < x; j++)

map[j][0] = 0;

}

}

for (int i = 0; i < y; i++) {

if (map[0][i] == 0) {

for (int j = i; j < y; j++)

map[0][j] = 0;

}

}

for (int i = 1; i < x; i++) {

for (int j = 1; j < y; j++) {

if (map[i][j] == 1) {

map[i][j] = map[i][j-1] + map[i-1][j];

}

}

}

return map[x-1][y-1];

}

}

附:诗

鸟儿愿为一朵云。

云儿愿为一只鸟。

the bird wishes it were a cloud.

the cloud wishes it were a bird.

——泰戈尔《飞鸟集》

以上

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值