Найти сумму максимальных значений - C#
Формулировка задачи:
Доброго времени суток. Вот условие задачи: Выставка проходит в зале, разделенном на MxN павильонов. Каждая из 4 стен имеет дверь в соседний павильон (кроме граничных). Каждый павильон раздает посетителям предмет одного вида, выдают только один раз в одни руки. Однако посещать данный павильон можно сколь угодно раз. Путь начинается с (1,1) и состоит и последовательности координат. Необходимо выяснить, на какую максимальную сумму можно набрать предметов в течение К минут, если на посещение одного павильона дается 1 минута.
В общем проблема в поиске ближайшего максимального значения, я вроде бы написал проверку, но что-то все равно не так, я уже не знаю как там поменять. Помогите пожалуйста.
Вот мои наработки:
Все, что закомментировано тоже можно использовать, может там что правильное и было.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int n, m, i, j, k, max = 0;
Console.WriteLine("Введите n: ");
n = Int32.Parse(Console.ReadLine());
Console.WriteLine("Введите m: ");
m = Int32.Parse(Console.ReadLine());
if ((m == 0 || n == 0) || (m < 0 || n < 0) || (m == 0 && n == 0) || (m < 0 && n < 0))
{
Console.WriteLine("Ошибка, не корректно введено значение!");
}
int[,] mas = new int[n, m];
Console.WriteLine("Вот он, выставочный зал: ");
Random r = new Random();
for (i = 0; i < n; i++)
{
for (j = 0; j < m; j++)
{
mas[i, j] = r.Next(9);
Console.Write(mas[i, j] + "\t");
}
Console.WriteLine();
}
Console.WriteLine();
//for (i = 0; i < n; i++)
//{
// for (j = 0; j < m; j++)
// {
// dubl[i, j] = 0;
// Console.Write(dubl[i, j] + "\t");
// }
// Console.WriteLine();
//}
Console.WriteLine("------------------------------------------------");
Console.WriteLine("Введите количество минут на посещение выставки: ");
k = Int32.Parse(Console.ReadLine());
int p;
int e = 0;
int g = 0;
int h = 0;
int s = 0;
p = mas[0, 0];
for (i = 0; i < 1; i++)
{
for (j = 0; j < k; j++)
{
if (mas[i, j + 1] > mas[i + 1, j])
{
//mas[i, j] = mas[i, j] + mas[i, j + 1];
p += mas[i, j + 1];
}
if (mas[i + 1, j] > mas[i, j + 1])
{
// mas[i, j] = mas[i + 1, j] + mas[i, j];
e += mas[i + 1, j];
}
if ((i >= 1 && j >= 1) || (i >= 1 || j >= 1))
{
if (mas[i - 1, j] > mas[i, j + 1] && mas[i - 1, j] > mas[i + 1, j] && mas[i - 1, j] > mas[i, j - 1])
{
g += mas[i - 1, j];
}
if (mas[i, j - 1] > mas[i, j + 1] && mas[i, j - 1] > mas[i + 1, j] && mas[i, j - 1] > mas[i - 1, j])
{
h += mas[i, j - 1];
}
}
int[] dubl = new int[] { p, e, g, h };
Console.WriteLine();
for (i = 0; i < 3; i++)
Console.Write(dubl[i] + " ");
for (i = 0; i < 3; i++)
{
if (max < dubl[i])
dubl[i] = max;
}
s = max + s;
Console.Write(p + "\t");
}
}
//for (i = 0; i < 1; i++)
//{
// for (j = 0; j < k; j++)
// {
// if (mas[i, j + 1] > mas[i + 1, j])
// {
// //mas[i, j] = mas[i, j] + mas[i, j + 1];
// p+= mas[i, j+1];
// }
// if (mas[i + 1, j] > mas[i, j + 1])
// {
// // mas[i, j] = mas[i + 1, j] + mas[i, j];
// p+= mas[i+1, j];
// }
// if (i>=1 && mas[i - 1, j] > mas[i, j + 1] && mas[i - 1, j] > mas[i + 1, j] && mas[i - 1, j] > mas[i, j - 1])
// {
// p+= mas[i - 1, j];
// }
// if (j >= 1 && mas[i, j-1] > mas[i, j + 1] && mas[i, j-1] > mas[i + 1, j] && mas[i, j-1] > mas[i-1, j])
// {
// p += mas[i, j-1];
// }
// Console.Write(p+ "\t");
// //cur = Max(mas[i + 1, j], mas[i - 1, j], mas[i, j + 1], mas[i, j - 1]) + mas[i, j];
// }
//}
Console.WriteLine("Максимальная сумма составляет: " + s);
//for (i = 0; i < n; i++)
//{
// for (j = 0; j < m; j++)
// {
// Console.Write(mas[i, j] + "\t");
// }
// Console.WriteLine();
//}
Console.ReadKey();
}
//public static int Max(int v1, int v2, int v3, int v4)
//{
// return Math.Max(Math.Max(v1, v2), Math.Max(v3, v4));
//}
}
}Решение задачи: «Найти сумму максимальных значений»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Numerics;
using System.Diagnostics;
using System.Threading;
using System.Data;
namespace ConsoleApplication1
{
class Program
{
static Random rnd = new Random();
static void Main(string[] args)
{
Console.Write("n=");
int n = int.Parse(Console.ReadLine());
Console.Write("m=");
int m = int.Parse(Console.ReadLine());
int[,] labirinth = new int[n, m];
for(int i = 0; i < labirinth.GetLength(0); i++)
{
for(int j = 0; j < labirinth.GetLength(1); j++)
{
labirinth[i, j] = rnd.Next(1, 10);
Console.Write(labirinth[i, j] + " ");
}
Console.WriteLine();
}
Console.Write("t=");
int t = int.Parse(Console.ReadLine());
Console.WriteLine(MaxSum(labirinth, t));
Console.ReadKey(true);
}
static int MaxSum(int[,] array, int elapsedTime, int x = 0, int y = 0, int sum = 0)
{
array = (int[,])array.Clone();
sum += array[x, y];
array[x, y] = 0;
if(--elapsedTime == 0) return sum;
if(x == 0)
{
if(y == 0) return Math.Max(MaxSum(array, elapsedTime, x+1, y, sum), MaxSum(array, elapsedTime, x, y+1, sum));
if(y == array.GetLength(1) - 1) return Math.Max(MaxSum(array, elapsedTime, x+1, y, sum), MaxSum(array, elapsedTime, x, y-1, sum));
return Math.Max(Math.Max(MaxSum(array, elapsedTime, x+1, y, sum), MaxSum(array, elapsedTime, x, y+1, sum)), MaxSum(array, elapsedTime, x, y-1, sum));
}
if(x == array.GetLength(0) - 1)
{
if(y == 0) return Math.Max(MaxSum(array, elapsedTime, x-1, y, sum), MaxSum(array, elapsedTime, x, y+1, sum));
if(y == array.GetLength(1) - 1) return Math.Max(MaxSum(array, elapsedTime, x-1, y, sum), MaxSum(array, elapsedTime, x, y-1, sum));
return Math.Max(Math.Max(MaxSum(array, elapsedTime, x-1, y, sum), MaxSum(array, elapsedTime, x, y+1, sum)), MaxSum(array, elapsedTime, x, y-1, sum));
}
if(y == 0)
{
return Math.Max(Math.Max(MaxSum(array, elapsedTime, x+1, y, sum), MaxSum(array, elapsedTime, x, y+1, sum)), MaxSum(array, elapsedTime, x-1, y, sum));
}
if(y == array.GetLength(0) - 1)
{
return Math.Max(Math.Max(MaxSum(array, elapsedTime, x-1, y, sum), MaxSum(array, elapsedTime, x+1, y, sum)), MaxSum(array, elapsedTime, x, y-1, sum));
}
return Math.Max(Math.Max(MaxSum(array, elapsedTime, x+1, y, sum), MaxSum(array, elapsedTime, x, y+1, sum)), Math.Max(MaxSum(array, elapsedTime, x-1, y, sum), MaxSum(array, elapsedTime, x, y-1, sum)));
}
}
}