题目
给你一个正方形字符数组 board ,你从数组最右下方的字符 ‘S’ 出发。
你的目标是到达数组最左上角的字符 ‘E’ ,数组剩余的部分为数字字符 1, 2, …, 9 或者障碍 ‘X’。在每一步移动中,你可以向上、向左或者左上方移动,可以移动的前提是到达的格子没有障碍。
一条路径的 「得分」 定义为:路径上所有数字的和。
请你返回一个列表,包含两个整数:第一个整数是 「得分」 的最大值,第二个整数是得到最大得分的方案数,请把结果对 10^9 + 7 取余。
如果没有任何路径可以到达终点,请返回 [0, 0] 。
示例 1:
输入:board = [“E23”,“2X2”,“12S”]
输出:[7,1]
示例 2:
输入:board = [“E12”,“1X1”,“21S”]
输出:[4,2]
示例 3:
输入:board = [“E11”,“XXX”,“11S”]
输出:[0,0]
提示:
2 <= board.length == board[i].length <= 100
解法一(循环)
解法思路:直接使用循环,因为每个节点依赖于上一个节点,因此从最右下角的节点分别沿着横纵两个方向,一步一步移动到数组开始的左上角。
本算法使用三维数组,在第三维保存对应索引位置的初始值、得分、路径数量和是否可达四个信息,实现算法如下(比赛之后实现的):
时间复杂度为O(n2),空间复杂度O(n2)(由于使用三维数组存储)
public class Solution {
long [,,] intBoard;
public int[] PathsWithMaxScore(IList<string> board) {
//1. 链表转存到数组中
int row=board.Count,column=board[0].Length;
intBoard = new long [row,column,4];
for(int i=0;i<row;i++)
{
for(int j=0;j<column;j++)
{
if(board[i][j] >= '0' && board[i][j] <= '9')
{
intBoard[i,j,0] = Convert.ToInt64(board[i][j] - '0');
}
else if(board[i][j] == 'E' || board[i][j] == 'S')
{
intBoard[i,j,0] = 0;
}
else
{
intBoard[i,j,0] = -1;
}
intBoard[i,j,1] = 0;
intBoard[i,j,2]