휴대폰 충전


10

대학 코드 챌린지 컨테스트의 허가를받은 챌린지


우리는 휴대 전화에 의존하여 매일 밤 최대 배터리 수준까지 충전하므로 다음날 중순까지 전원이 부족해질 위험이 없습니다. 낮에 무료 콘센트를 볼 때 발생할 수있는 일에 대해 요금을 청구하는 사람들도 있습니다.

나는 그들 중 하나입니다.

수년에 걸쳐, 나는 매일 밤 배터리를 최대로 충전하지 않도록 기술을 개선했습니다. 완벽하게 알려진 반복 루틴을 통해 하루 중 몇 시간 동안 부분 재충전을 수행 할 수 있는지 (및 레벨이 증가하는 단위 수) 각 충전 사이의 배터리 수준을 낮추는 방법이 명확합니다. 이 데이터를 사용하여 매일 밤 나는 다음 날 집을 떠나야하는 최소 배터리 수준을 계산하여 자체적으로 부과 한 두 단위 임계 값 아래로 떨어지지 않도록합니다.

내가 아직 마스터하지 않은 것은 확립 된 루틴을 떠날 때와 동일한 계산이며 수행 할 몇 가지 대안이 있습니다. 예를 들어, 다른 방법으로 도착할 수있는 다른 도시로가는 날에 발생합니다.

문제에 대한 첫 번째 접근 방식에서는 왼쪽 상단 모서리에서 오른쪽 하단 모서리까지 "체스 판"주위를 이동하고 싶다고 가정합니다. 각 "셀"에서 모바일을 특정 금액으로 충전 할 수 없거나,로드 할 수없고로드 레벨이 떨어집니다.

도전

정수의 FxC 매트릭스가 주어지면 부하 수준이 2 단위 아래로 떨어지지 않고 왼쪽 상단에서 오른쪽 하단으로 이동하는 데 필요한 최소 배터리 수준을 출력하십시오.

매트릭스에서 양수는 경로를 따라 다시 시작하기 전에 휴대폰을 충전 할 수있는 양을 나타내며 음수는 콘센트가없고 휴대폰 배터리가 충전량을 그 수준만큼 떨어 뜨린다는 것을 나타냅니다. 소스 및 대상 셀 (왼쪽 위 및 오른쪽 아래 모서리)의 수량은 항상 0이며 나머지 값 (절대 값)은 100을 초과하지 않아야합니다.


:

[📱111111111111110]

배터리가 덜 필요한 경로는 다음과 같습니다.

[📱111111111111110]

필요한 최소 배터리 잔량은 4입니다.

노트

  • 시작은 항상 왼쪽 상단이됩니다
  • 끝은 항상 오른쪽 아래 모서리가됩니다
  • 이미 통과 한 셀로 이동할 수 없습니다. 예 : (0,1) 위치에 있으면 초기 지점 (0,0)으로 이동할 수 없습니다
  • 어떤 이유로 든 배터리 잔량이 2 미만일 수 없습니다
  • 항상 시작과 끝이 있다고 가정 할 수 있습니다
  • 필요한 경우 1 차원 배열을 다차원으로 취할 수 있습니다 [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]]
Kamil Drakari

1
어떤 @dana,이 단지 2있다 0s좌측 상단에 하나는 오른쪽 아래에 다른 하나 배치
루이스 펠리페 드 예수님 무 노즈

답변:


3

자바 스크립트 (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

3

파이썬 2 , 208202 바이트

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

온라인으로 사용해보십시오!


파이썬 2 , 217211 바이트

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}

온라인으로 사용해보십시오!


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;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.