Сотовый телефон Charge

10

Вызов с разрешения моего конкурса на участие в университетском коде


Зависимость, которую мы имеем от мобильных телефонов, заставляет нас заряжать их каждую ночь до максимального уровня заряда батареи, поэтому мы не рискуем разрядиться к середине следующего дня. Есть даже люди, которые, когда видят бесплатную розетку в течение дня, выставляют ее за то, что может случиться.

Я являюсь одним из них.

За прошедшие годы я усовершенствовал свою технику, чтобы не заряжать батарею по максимуму каждую ночь. Благодаря моим хорошо известным повторяющимся процедурам мне ясно, в какое время дня я буду в состоянии выполнять эти частичные перезарядки (и на сколько единиц будет увеличиваться уровень), и что понижает уровень заряда батареи между каждым зарядом. Используя эти данные, каждую ночь я вычисляю минимальный уровень заряда батареи, с которым я должен выходить из дома на следующий день, чтобы он никогда не опускался ниже моего добровольного порога в две единицы.

То, что мне еще не удалось освоить, - это тот же самый расчет, когда я покидаю установленную рутину, и у меня есть несколько альтернативных действий. Это происходит, например, в дни, когда я нахожусь в пути в другой город, куда я могу приехать разными способами.

В моем первом подходе к проблеме я предполагаю, что хочу переместиться вокруг «шахматной доски», от верхнего левого угла до нижнего правого угла. В каждой «ячейке» я могу либо зарядить мобильный телефон определенной суммой, либо я не могу, и уровень его загрузки снижается.

Вызов

Учитывая целую матрицу FxC, выведите минимальное значение уровня заряда батареи, которое мне нужно, чтобы перейти из верхнего левого угла в нижний правый, при этом уровень нагрузки никогда не опускался ниже 2 единиц.

В матрице положительное число указывает, сколько я могу зарядить свой мобильный телефон, прежде чем я должен возобновить следовать по моему пути, в то время как отрицательное число указывает, что нет розеток и что батарея мобильного телефона падает уровень заряда на эту сумму. Гарантируется, что величины в ячейках источника и назначения (верхний левый и нижний правый угол) всегда равны 0, а остальные значения (абсолютное значение) не превышают 100.

Пример
:

[📱-11-1-1-1-1-1-11-1-111-10]

Путь мне нужно меньше батареи это:

[📱-11-1-1-1-1-1-11-1-111-10]

И минимальный уровень заряда батареи мне нужно 4

Ноты

  • Старт всегда будет в верхнем левом углу
  • Конец всегда будет в правом нижнем углу
  • Вы не можете перейти в камеру, которую вы уже прошли. Пример: Попав в позицию (0,1), вы не можете перейти к начальной точке (0,0)
  • Уровень заряда батареи не может (по любой причине) упасть ниже 2
  • Вы можете предположить, что всегда будет начало и конец
  • Вы можете взять одномерные массивы как многомерные, если вам нужно [1,2,3] == [[1,2,3]]
  • Может быть несколько правильных (минимально необходимый заряд) путей
  • Ваша цель - выводить только самый низкий начальный уровень заряда батареи, а не маршрут
  • Вы можете идти только вертикально и горизонтально (не по диагонали)

Тестовые случаи

[0, 0] => 2
[0, 1, 0] => 2
[0, -1, 0] => 3
[0, 15, -20, 5, 0] => 7
[[0, -3],[-5, 0]] => 5
[[0, -5, -9, 5], [-3, 5, 2, -2], [2, -4, -4, 0]] => 5
[[0, -1, 1, -1], [-1, -1, -1, -1], [-1, 1, -1, -1], [1, 1, -1, 0]] => 4
Луис Фелипе Де Иисус Муньос
источник
Я забыл день испытания. Песочница сообщение
Луис Фелипе Де Иисус Муньос
Всем, кто помнит: задача «Голодный лось» никогда не выходила из песочницы, так что это не обман.
Черная Сова Кай
@ BlackOwlKai Я думаю, что обе проблемы разные
Луис Фелипе Де Иисус Муньос
1
Будет ли когда-нибудь оптимальный путь для движения влево или вверх? Например[[0,1,-1],[-9,-9,1],[-9,1,-1],[-9,-1,-9],[-9,1,0]]
Камил Дракари
1
@ Дана нет, только 2 0sразмещены один в верхнем левом углу, а другой в правом нижнем
Луис Фелипе Де Хесус Муньос

Ответы:

3

JavaScript (ES7),  162 156  154 байта

m=>(M=g=(x,y,n,k)=>m.map((r,Y)=>[r[x+1]]+[m[y+1]]?r.map((v,X)=>r[1/v&&(x-X)**2+(y-Y)**2==1&&g(X,Y,u=v+n,k<u?k:u,r[X]=g),X]=v):M=M>k?M:k))(0,0,0)|M<0?2-M:2

Попробуйте онлайн!

комментарии

m => (                          // m[] = input matrix
  M =                           // initialize M to a non-numeric value
  g = (x, y, n, k) =>           // g = recursive depth-first search function
    m.map((r, Y) =>             // for each row r[] at position Y in m[]:
      [r[x + 1]] +              //   if either r[x + 1]
      [m[y + 1]] ?              //   or m[y + 1] is defined:
        r.map((v, X) =>         //     for each value v at position X in r[]:
          r[                    //
            1 / v &&            //       if v is numeric
            (x - X) ** 2 +      //       and the squared Euclidean distance
            (y - Y) ** 2 == 1   //       between (x, y) and (X, Y) is 1:
            &&                  //
              g(                //         do a recursive call:
                X, Y,           //           with (X, Y)
                u = v + n,      //           with n = n + v
                k < u ? k : u,  //           with k = min(k, n + v)
                r[X] = g        //           set r[X] to a non-numeric value
              ),                //         end of recursive call
            X                   //       then restore r[X]
          ] = v                 //       to its initial value
        )                       //     end of inner map()
      :                         //   else (we've reached the bottom right corner):
        M = M > k ? M : k       //     update M to max(M, k)
    )                           // end of outer map()
)(0, 0, 0) |                    // initial call to g with x = y = n = 0 and k undefined
M < 0 ? 2 - M : 2               // return 2 - M if M is negative, or 2 otherwise
Arnauld
источник
3

Python 2 , 208 202 байта

lambda s:2-f(s)
def f(s,x=0,y=0):
 if x>-1<y<s[y:]>[]<s[y][x:]!="">s[y][x]:k=s[y][x];s[y][x]="";return k+min(0,max([len(s[y+1:]+s[y][x+1:])and f(eval(`s`),x+a/3-1,y+a%3-1)for a in 7,1,5,3]))
 return-9e9

Попробуйте онлайн!


Python 2 , 217 211 байт

i=input()
X,Y=len(i[0]),len(i)
s=[[0]*4+[i]];r=[]
for m,l,x,y,g in s:
 if X>x>-1<y<Y<"">g[y][x]:r+=[m]*(Y-y<2>X-x);l+=g[y][x];g[y][x]="";s+=[[min(m,l),l,x+a/3-1,y+a%3-1,eval(`g`)]for a in 7,1,5,3]
print 2-max(r)

Попробуйте онлайн!

овс
источник
1

R , 224 220 217 213 210 байтов

f=function(x,m=rbind(0,cbind(0,x,0),0),i=2,j=2,p=F,k=c(1:-1,0,0,-1:1),b=Inf,`^`=min){m[i,j]=0
for(h in 1:4)b=b^'if'(all(c(R<-i+k[h],C<-j+k[h+4])>dim(x)),max(2,2-cumsum(p)^0),if(v<-m[R,C])b^f(x,m,R,C,c(p,v)))
b}

Попробуйте онлайн!

digEmAll
источник
1

C # (интерактивный компилятор Visual C #) , 242 байта

a=>{int m=1<<31,n=~m;void g(int w,int x,int y,int z){for(int i=4,t,c,d,e;i-->0;)try{t=a[c=i<1?w-1:i<2?w+1:w,d=i>2?x-1:i>1?x+1:x];n=t==0&z<n?z:n;a[c,d]=m;e=y+t<2?2-y-t:0;if(t!=m)g(c,d,y+t+e,z+e);a[c,d]=t;}catch{}}a[0,0]=m;g(0,0,2,2);return n;}

Попробуйте онлайн!

//a: input matrix
a=>{
  // m: marker for used cells
  // n: result, initialized to a huge value
  int m=1<<31,n=~m;
  // recursive function
  // w: 1st dim coordinate
  // x: 2nd dim coordinate
  // y: current charge level
  // z: initial charge for current path
  void g(int w,int x,int y,int z){
    // i: loop variable
    // t: temp holds overwritten value
    // c: adjacent 1st dim coordinate
    // d: adjacent 2nd dim coordinate
    // e: delta charge needed
    for(int i=4,t,c,d,e;i-->0;)
      // avoid index out of range errors
      // by using try/catch
      try{
        // determine neighbor
        // coordinates and save value
        t=a[c=i<1?w-1:i<2?w+1:w,
            d=i>2?x-1:i>1?x+1:x];
        // if we have found a 0, check if
        // initial charge is lower than the
        // lowest so far. save it if it is.
        n=t==0&z<n?z:n;
        // mark current cell used
        a[c,d]=m;
        // determine if we need to
        // increase the initial charge
        e=y+t<2?2-y-t:0;
        // make recursive call if current
        // cell was not previously in use
        if(t!=m)g(c,d,y+t+e,z+e);
        // restore current cell value
        a[c,d]=t;
      }catch{}
  }
  // mark starting cell used
  a[0,0]=m;
  // start the recursive function
  g(0,0,2,2);
  // return the result to the caller
  return n;
}
Dana
источник