- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有以下问题:对于 nXn 矩阵,我们将定义一个大小为 k 的“蠕虫”,它是一系列具有连续数字的相邻单元格。相邻单元格是从当前单元格的右\左\上\下开始的单元格(不是对角线)。我需要编写一个递归函数,返回数组中最长的蠕虫例如:在矩阵中:
{{3,4,5,6},
{5,6,2,7},
{12,13,14,15},
{19,18,17,16}};
最长的蠕虫有 8 个细胞。从 [2][0] 开始,到 [3][0] 结束。
到目前为止我已经编写了以下代码:
public static int longestWarm(int[][] arr, int row, int col) {
if (row < 0 || row >= arr.length || col < 0 || col >= arr.length) return 0;
if (col >= arr.length || row >= arr.length) return 0;
int sum1 = 1, sum2 = 1, sum3 = 1, sum4 = 1;
if (row > 0 && arr[row][col] == arr[row - 1][col] - 1)
sum1 = 1 + longestWarm(arr, row - 1,col);
else if (row < arr[0].length - 1 && arr[row][col] == arr[row + 1][col] - 1)
sum2 = 1 + longestWarm(arr, row + 1, col);
else if (col > 0 && arr[row][col] == arr[row][col - 1] - 1)
sum3 = 1 + longestWarm(arr, row, col - 1);
else if (col < arr[0].length - 1 && arr[row][col] == arr[row][col + 1] - 1)
sum4 = 1 + longestWarm(arr, row, col + 1);
int max1 = Math.max(sum1, sum2);
int max2 = Math.max(sum3, sum4);
return Math.max(max1, max2);
}
问题是我得到了在矩阵中找到的第一个蠕虫,而不是最大的蠕虫。我的输出是5而不是8。请帮助找出我做错了什么。
最佳答案
我使用 is_tail 方法只修剪检查从单元格开始且邻居不比它小 1 的蠕虫。如果存在这样的邻居,那么它显然不是最长蠕虫的尾部。从每条尾部中,您会发现最大尺寸的蠕虫,该蠕虫从该细胞中生长出来,与您所做的类似。
import java.util.ArrayList;
//a pair of ints, row and col, that indicate a cell in a matrix
class Cell {
int row;
int col;
public Cell(int row, int col) {
this.row = row;
this.col = col;
}
public int get_row() {
return row;
}
public int get_col() {
return col;
}
public String toString() {
return "row: " + row + " col: " + col;
}
}
// a class to hold the matrix data and methods
// so that every call doesnt require passing the pointer m
class Matrix {
// m used for the matrix so that i dont have to type matrix repeatedly
int[][] m;
int height;
int width;
public Matrix(int[][] m) {
this.m = m;
height = m.length;
width = m[0].length;
}
public int get_height() {
return height;
}
public int get_width() {
return width;
}
// checks if the cell at row,col is a tail
// a tail is a cell with 0 neighbors that are 1 less than its value
public boolean is_tail(int row, int col) {
if (row < 0 || row >= m.length || col < 0 || col >= m[0].length)
return false;
int curVal = m[row][col]; // Value in the cell being checked
// check if neighbor is out of bounds, then if it is smaller
if (row - 1 >= 0 && m[row - 1][col] == curVal - 1)
return false;
if (row + 1 < m.length && m[row + 1][col] == curVal - 1)
return false;
if (col - 1 >= 0 && m[row][col - 1] == curVal - 1)
return false;
if (col + 1 < m[0].length && m[row][col + 1] == curVal - 1)
return false;
return true;
}
public ArrayList<Cell> longestWorm(int row, int col) {
if (row < 0 || row >= m.length || col < 0 || col >= m[0].length)
return new ArrayList<Cell>();
int curVal = m[row][col];
ArrayList<Cell> longest_path = new ArrayList<Cell>();
if (row - 1 >= 0 && m[row - 1][col] == curVal + 1) {
ArrayList<Cell> path_left = longestWorm(row - 1, col);
if (path_left.size() > longest_path.size())
longest_path = path_left;
}
if (row + 1 < m.length && m[row + 1][col] == curVal + 1) {
ArrayList<Cell> path_right = longestWorm(row + 1, col);
if (path_right.size() > longest_path.size())
longest_path = path_right;
}
if (col - 1 >= 0 && m[row][col - 1] == curVal + 1) {
ArrayList<Cell> path_up = longestWorm(row, col - 1);
if (path_up.size() > longest_path.size())
longest_path = path_up;
}
if (col + 1 < m[0].length && m[row][col + 1] == curVal + 1) {
ArrayList<Cell> path_down = longestWorm(row, col + 1);
if (path_down.size() > longest_path.size())
longest_path = path_down;
}
longest_path.add(new Cell(row, col));
return longest_path;
}
}
class Main {
public static void main(String[] args) {
int[][] matrix = { { 3, 4, 5, 6 }, { 5, 6, 2, 7 }, { 12, 13, 14, 15 }, { 19, 18, 17, 16 } };
ArrayList<Cell> longest_worm = new ArrayList<Cell>();
Matrix myMatrix = new Matrix(matrix);
for (int i = 0; i < myMatrix.get_height(); i++) {
for (int j = 0; j < myMatrix.get_width(); j++) {
if (myMatrix.is_tail(i, j)) {
ArrayList<Cell> new_worm = myMatrix.longestWorm(i, j);
if (new_worm.size() > longest_worm.size()) {
longest_worm = new_worm;
}
}
}
}
for (int i = longest_worm.size() - 1; i >= 0; i--) {
System.out.println(longest_worm.get(i));
}
}
}
关于java - 递归-找到矩阵中最大的蠕虫,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44959439/
“用 Haskell 进行函数式思考”中的练习之一是使用融合定律使程序更加高效。我在尝试复制答案时遇到了一些麻烦。 部分计算要求您将 maximum (xs++ map (x+) xs) 转换为 ma
我正在尝试获得 R 中最大/最小的可表示数字。 输入“.Machine”后 我有: $double.xmin [1] 2.225074e-308 $double.xmax [1] 1.797693e+
有没有办法更改浏览器验证消息 请检查所附图片。 我目前正在使用 wooCommerce 目前它显示小于或等于 X 个数字,我想更改为请求超过 X 个项目的报价。 请多多指教 最佳答案 您需要使用oni
我正在尝试将解决方案从 Excel 求解器复制到 R 中,但不知道从哪里开始。 问题: 每小时选择 5 个选项(5 行),以最大化“分数”的总和,而无需在多个小时内选择同一组 2 次。 换句话说: 最
Haskell 中是否有这样的功能: max_of_type :: (Num a) => a 所以: max_of_type :: Int == 2 ^ 31 - 1 // for example,
我有这两个表示时间范围(秒)的输入字段,我需要这样设置,以便“from/min”字段不能高于“to/max”,反之亦然。 到目前为止我得到了这个: jQuery(document).ready(fun
我有一个看起来像这样的表: http://sqlfiddle.com/#!9/152d2/1/0 CREATE TABLE Table1 ( id int, value decimal(10,
我会尝试尽可能简单地解释它: 首先是一些带有虚拟数据的数据库结构。 结构 tb_spec_fk feature value ----------------- 1 1 1
我有两个表。 表 1: +---------+---------+ | Lead_ID | Deal_ID | +---------+---------+ | 2323 | null |
我的数据库中有一个字段可以包含数字,例如8.00 或范围编号,例如8.00 - 10.00。 如果您将每个数字作为单独的数字,我需要从表中获取 MIN() 和 MAX()。例如当范围为 8.00 -
max(float('nan'), 1) 计算结果为 nan max(1, float('nan')) 计算结果为 1 这是预期的行为吗? 感谢您的回答。 max 在 iterable 为空时引发异常
我想问一下如何在 CSS 中创建一个页脚栏,它具有最小宽度(比如 650 像素),并且会根据窗口大小进行拉伸(stretch),但仅限于某个点(比如 1024 像素)。 我的意思是当窗口大小为例如 1
我尝试调整表格列宽(下一个链接上的“作者”列 http://deploy.jtalks.org/jcommune/branches/1?lang=en)。我已将最小/最大属性添加到 .author-c
在 C# 中,是否有用于将最小值和最大值存储为 double 值的内置类? 此处列出的要点 http://msdn.microsoft.com/en-us/library/system.windows
问题: 每个任务队列是否可以每秒处理超过 500 个任务? 每个 GAE 应用是否可以每秒处理超过 50,000 个任务? 详细信息: Task queue quota文档说: Push Queue
我想知道是否允许最大或最小堆树具有重复值?我试图仅通过在线资源查找与此相关的信息,但一直没有成功。 最佳答案 是的,他们可以。您可以在“算法简介”(Charles E. Leiserson、Cliff
首先,我是 .NET 开发人员,喜欢 C# 中的 LINQ 和扩展方法。 但是当我编写脚本时,我需要相当于 Enumerable extension methods 的东西 任何人都可以给我任何建议/
这是一个检查最大 malloc 大小的简单程序: #include std::size_t maxDataSize = 2097152000; //2000mb void MallocTest(vo
我想找到我的数据的最小值和最大值。 我的数据文件: 1 2 4 5 -3 -13 112 -3 55 42 42 而我的脚本: {min=max=$1} {if ($1max) {max=$1}
我想查询我的Elastic-Search以获取仅具有正值的最低价格价格。我的价格也可以为零和-1;所以我不希望我的最小聚合返回0或-1。我知道我应该向查询(或过滤器)添加脚本,但是我不知道如何。我当前
我是一名优秀的程序员,十分优秀!