function решить(в) {
  try {
    в = в || {};
    var R = в.размер | 0;
    if (R < 5 || R > 60) R = 15;
    var N = R * R;
    var я0 = в.я || {};
    var id = я0.id | 0, xx = я0.x | 0, yy = я0.y | 0, hp = я0.здоровье | 0, груз = я0.груз | 0;
    var ход = в.ход | 0;
    var всего = в.всего_ходов | 0; if (всего < 1) всего = 150;
    var ост = всего - ход;
    var мб = в.моя_база || {}, чб = в.чужая_база || {};
    var базаX = (мб.x != null ? мб.x : 1) | 0, базаY = (мб.y != null ? мб.y : 1) | 0;
    var вбазаX = (чб.x != null ? чб.x : R - 2) | 0, вбазаY = (чб.y != null ? чб.y : R - 2) | 0;
    var видно = в.видно || [];
    var пм = (в.память && typeof в.память === "object" && !Array.isArray(в.память)) ? в.память : {};
    var об = (в.общая && typeof в.общая === "object" && !Array.isArray(в.общая)) ? в.общая : {};

    function И(x, y) { return y * R + x; }
    function KX(k) { return k - ((k / R) | 0) * R; }
    function KY(k) { return (k / R) | 0; }
    function норм(x, y) { return x >= 0 && y >= 0 && x < R && y < R; }
    function ман(x1, y1, x2, y2) { var a = x1 - x2; if (a < 0) a = -a; var b = y1 - y2; if (b < 0) b = -b; return a + b; }
    function манK(a, b) { return ман(KX(a), KY(a), KX(b), KY(b)); }
    function jit(k) { return (k * 7 + id * 13 + ход * 5) % 11; }
    function напрК(k) { var dx = KX(k) - xx, dy = KY(k) - yy; return dx > 0 ? "В" : dx < 0 ? "З" : dy > 0 ? "Ю" : "С"; }

    var start = И(xx, yy);
    var baseK = И(базаX, базаY);
    var myBit = 1 << (id & 3);
    var i, j;

    for (var ok in об) { if (ok !== "m" && ok !== "f" && ok !== "c" && ok !== "g") delete об[ok]; }
    for (var pk in пм) { if (pk !== "t" && pk !== "f") delete пм[pk]; }

    var mstr = (typeof об.m === "string" && об.m.length === N) ? об.m : null;
    var M = new Array(N);
    for (i = 0; i < N; i++) { var cv = mstr ? mstr.charCodeAt(i) - 48 : 0; M[i] = (cv >= 0 && cv <= 2) ? cv : 0; }
    if (!Array.isArray(об.f)) об.f = [];
    if (!Array.isArray(об.c)) об.c = [];
    if (!Array.isArray(об.g)) об.g = [];
    var tmp = [];
    for (i = 0; i < об.f.length; i++) { var fe = об.f[i]; if (Array.isArray(fe) && fe.length >= 3 && (fe[1] | 0) > 0 && fe[0] >= 0 && fe[0] < N) tmp.push([fe[0] | 0, fe[1] | 0, fe[2] | 0]); }
    об.f = tmp;
    tmp = [];
    for (i = 0; i < об.c.length; i++) { var ce = об.c[i]; if (Array.isArray(ce) && ce.length >= 3 && (ce[2] | 0) >= ход && (ce[1] | 0) > 0 && ce[0] >= 0 && ce[0] < N) tmp.push([ce[0] | 0, ce[1] | 0, ce[2] | 0]); }
    об.c = tmp;
    tmp = [];
    for (i = 0; i < об.g.length; i++) { var ge = об.g[i]; if (Array.isArray(ge) && ge.length >= 2 && (ge[1] | 0) >= ход - 2 && ge[0] >= 0 && ge[0] < N) tmp.push([ge[0] | 0, ge[1] | 0]); }
    об.g = tmp;

    function markDanger(ek) {
      var ex = KX(ek), ey = KY(ek);
      danger[ek] = 1;
      if (ex + 1 < R) danger[ek + 1] = 1;
      if (ex > 0) danger[ek - 1] = 1;
      if (ey + 1 < R) danger[ek + R] = 1;
      if (ey > 0) danger[ek - R] = 1;
    }

    var occ = {};
    var adjEn = [], visEn = [];
    var едаТут = 0;
    for (i = 0; i < видно.length; i++) {
      var c = видно[i];
      if (!c || c.x == null || c.y == null) continue;
      var cx0 = c.x | 0, cy0 = c.y | 0;
      if (!норм(cx0, cy0)) continue;
      var k = И(cx0, cy0);
      var own = (cx0 === xx && cy0 === yy);
      M[k] = (c.что === "стена") ? 2 : 1;
      if (!own && (c.что === "свой" || c.что === "враг")) occ[k] = 1;
      if (c.что === "враг") {
        visEn.push(k);
        if (ман(cx0, cy0, xx, yy) === 1) adjEn.push(k);
        var fg = false;
        for (j = 0; j < об.g.length; j++) if (об.g[j][0] === k) { об.g[j][1] = ход; fg = true; break; }
        if (!fg) об.g.push([k, ход]);
      }
      var q = c.еда | 0;
      var fi = -1;
      for (j = 0; j < об.f.length; j++) if (об.f[j][0] === k) { fi = j; break; }
      if (q > 0) { if (fi >= 0) { об.f[fi][1] = q; об.f[fi][2] = ход; } else об.f.push([k, q, ход]); if (own) едаТут = q; }
      else if (fi >= 0) об.f.splice(fi, 1);
    }
    while (об.g.length > 8) об.g.shift();
    while (об.f.length > 30) { var wi = 0; for (i = 1; i < об.f.length; i++) if (об.f[i][2] < об.f[wi][2]) wi = i; об.f.splice(wi, 1); }
    if (об.c.length > 16) об.c.length = 16;

    var danger = new Uint8Array(N);
    for (i = 0; i < visEn.length; i++) markDanger(visEn[i]);
    for (i = 0; i < об.g.length; i++) markDanger(об.g[i][0]);

    var Q = new Int16Array(N);
    function bfs(srcK) {
      var dist = new Int16Array(N);
      for (var i2 = 0; i2 < N; i2++) dist[i2] = -1;
      if (srcK == null || srcK < 0 || srcK >= N || M[srcK] === 2) return dist;
      var h = 0, t = 0;
      dist[srcK] = 0; Q[t++] = srcK;
      while (h < t) {
        var cur = Q[h++]; var nd = dist[cur] + 1;
        var cx = cur - ((cur / R) | 0) * R, nk;
        if (cx + 1 < R) { nk = cur + 1; if (dist[nk] === -1 && M[nk] !== 2) { dist[nk] = nd; Q[t++] = nk; } }
        if (cx > 0) { nk = cur - 1; if (dist[nk] === -1 && M[nk] !== 2) { dist[nk] = nd; Q[t++] = nk; } }
        nk = cur + R; if (nk < N && dist[nk] === -1 && M[nk] !== 2) { dist[nk] = nd; Q[t++] = nk; }
        nk = cur - R; if (nk >= 0 && dist[nk] === -1 && M[nk] !== 2) { dist[nk] = nd; Q[t++] = nk; }
      }
      return dist;
    }

    var DIRS = [[0, -1, "С"], [0, 1, "Ю"], [-1, 0, "З"], [1, 0, "В"]];
    function выбратьШаг(distT, dangerPen) {
      var best = null, bs = Infinity;
      for (var j2 = 0; j2 < 4; j2++) {
        var nx = xx + DIRS[j2][0], ny = yy + DIRS[j2][1];
        if (!норм(nx, ny)) continue;
        var nk = И(nx, ny);
        if (M[nk] === 2 || occ[nk]) continue;
        var d = distT[nk];
        if (d < 0) continue;
        var s = d * 100 + (danger[nk] ? dangerPen : 0) + jit(nk);
        if (s < bs) { bs = s; best = DIRS[j2][2]; }
      }
      return best;
    }
    function жадныйШаг(tx, ty, dangerPen) {
      var best = null, bs = Infinity;
      for (var j2 = 0; j2 < 4; j2++) {
        var nx = xx + DIRS[j2][0], ny = yy + DIRS[j2][1];
        if (!норм(nx, ny)) continue;
        var nk = И(nx, ny);
        if (M[nk] === 2 || occ[nk]) continue;
        var s = ман(nx, ny, tx, ty) * 100 + (danger[nk] ? dangerPen : 0) + jit(nk);
        if (s < bs) { bs = s; best = DIRS[j2][2]; }
      }
      return best;
    }
    function шагБегства() {
      var best = null, bs = -Infinity;
      for (var j2 = 0; j2 < 4; j2++) {
        var nx = xx + DIRS[j2][0], ny = yy + DIRS[j2][1];
        if (!норм(nx, ny)) continue;
        var nk = И(nx, ny);
        if (M[nk] === 2 || occ[nk]) continue;
        var md = 99;
        for (var e2 = 0; e2 < visEn.length; e2++) { var d2 = манK(nk, visEn[e2]); if (d2 < md) md = d2; }
        var s = md * 300 - (danger[nk] ? 5000 : 0) - ман(nx, ny, базаX, базаY) * 20 + jit(nk);
        if (s > bs) { bs = s; best = DIRS[j2][2]; }
      }
      return best;
    }

    function снятьЗаявку(k) {
      for (var ci = 0; ci < об.c.length; ci++) {
        if (об.c[ci][0] === k) {
          var nm = об.c[ci][1] & ~myBit;
          if (nm) об.c[ci][1] = nm; else об.c.splice(ci, 1);
          return;
        }
      }
    }
    function снятьВсеМоиЗаявки() {
      for (var ci = об.c.length - 1; ci >= 0; ci--) {
        var nm = об.c[ci][1] & ~myBit;
        if (nm) об.c[ci][1] = nm; else об.c.splice(ci, 1);
      }
    }
    function поставитьЗаявку(k, exp) {
      снятьВсеМоиЗаявки();
      for (var ci = 0; ci < об.c.length; ci++) if (об.c[ci][0] === k) { об.c[ci][1] = об.c[ci][1] | myBit; об.c[ci][2] = exp; return; }
      if (об.c.length < 16) об.c.push([k, myBit, exp]);
    }

    function решитьБой() {
      if (!adjEn.length) { пм.f = 0; return null; }
      var e = adjEn[0];
      if (ост < 16 || hp <= 1) {
        var fs = шагБегства();
        if (fs) return { тип: "идти", куда: fs };
        пм.f = (пм.f | 0) + 1;
        return { тип: "бить", куда: напрК(e) };
      }
      var nearOwn = ман(KX(e), KY(e), базаX, базаY) <= 3;
      if (nearOwn || (пм.f | 0) < 2) {
        пм.f = (пм.f | 0) + 1;
        return { тип: "бить", куда: напрК(e) };
      }
      return null;
    }

    var акт = null;
    var наБазе = (start === baseK);
    var боевойУход = false;

    if (груз) {
      пм.f = 0;
      снятьВсеМоиЗаявки();
      if (наБазе) {
        акт = { тип: "положить" };
      } else if (ман(xx, yy, базаX, базаY) === 1) {
        акт = occ[baseK] ? { тип: "ждать" } : { тип: "идти", куда: напрК(baseK) };
      } else {
        var distB = bfs(baseK);
        var tight = distB[start] >= 0 && distB[start] + 2 >= ост;
        var dp = tight ? 0 : (adjEn.length ? 100000 : 350);
        var st = выбратьШаг(distB, dp);
        if (!st) st = жадныйШаг(базаX, базаY, dp);
        if (st) акт = { тип: "идти", куда: st };
        else if (adjEn.length) акт = { тип: "бить", куда: напрК(adjEn[0]) };
        else акт = { тип: "ждать" };
      }
    } else {
      var бой = решитьБой();
      if (бой) {
        акт = бой;
      } else {
        боевойУход = adjEn.length > 0;
        if (едаТут > 0) {
          акт = { тип: "взять" };
          снятьЗаявку(start);
        } else {
          var distMe = bfs(start);
          var distHB = bfs(baseK);
          var holdMode = ост < 25;
          var bestK = -1, bestDist = 0;
          var passes = holdMode ? 2 : 1;
          for (var pass = 0; pass < passes && bestK < 0; pass++) {
            var bestS = Infinity;
            for (i = 0; i < об.f.length; i++) {
              var fe2 = об.f[i], fk = fe2[0], qty = fe2[1];
              if (occ[fk] || fk === start) continue;
              var dm = distMe[fk];
              if (dm < 0) continue;
              var dh = distHB[fk]; if (dh < 0) dh = манK(fk, baseK) + 12;
              if (pass === 0) { if (holdMode && dm + dh + 2 > ост) continue; }
              else { if (dm > ост - 1) continue; }
              var cm = 0;
              for (j = 0; j < об.c.length; j++) if (об.c[j][0] === fk) { cm = об.c[j][1]; break; }
              var claims = 0;
              for (var b2 = 0; b2 < 4; b2++) if ((cm & (1 << b2)) && (1 << b2) !== myBit) claims++;
              if (claims >= qty) continue;
              var dvb = ман(KX(fk), KY(fk), вбазаX, вбазаY);
              var sc;
              if (pass === 0) sc = dm * 100 + dh * 100 - qty * 120 + claims * 250 + (dvb < 4 ? (4 - dvb) * 200 : 0) - (пм.t === fk ? 150 : 0) + jit(fk);
              else sc = dm * 100 + jit(fk);
              if (sc < bestS) { bestS = sc; bestK = fk; bestDist = dm; }
            }
          }
          var dpen = (боевойУход || hp <= 1 || ост < 16) ? 3000 : 25;
          if (bestK >= 0) {
            пм.t = bestK;
            поставитьЗаявку(bestK, ход + bestDist + 8);
            var distT = bfs(bestK);
            var st2 = выбратьШаг(distT, dpen);
            if (!st2) st2 = жадныйШаг(KX(bestK), KY(bestK), dpen);
            акт = st2 ? { тип: "идти", куда: st2 } : { тип: "ждать" };
          } else {
            delete пм.t;
            снятьВсеМоиЗаявки();
            var sec = id & 3, mid = R >> 1;
            var ek2 = -1, es = Infinity;
            for (var kk = 0; kk < N; kk++) {
              if (M[kk] !== 0) continue;
              var dm2 = distMe[kk];
              if (dm2 < 0) continue;
              var kx2 = KX(kk), ky2 = KY(kk);
              var inS = ((sec === 0 && kx2 < mid && ky2 < mid) || (sec === 1 && kx2 >= mid && ky2 < mid) || (sec === 2 && kx2 < mid && ky2 >= mid) || (sec >= 3 && kx2 >= mid && ky2 >= mid)) ? 0 : 250;
              var sc2 = dm2 * 100 + inS + jit(kk);
              if (sc2 < es) { es = sc2; ek2 = kk; }
            }
            var tgt = ek2 >= 0 ? ek2 : И(mid, mid);
            var distT2 = bfs(tgt);
            var st3 = выбратьШаг(distT2, dpen);
            if (!st3) st3 = жадныйШаг(KX(tgt), KY(tgt), dpen);
            акт = st3 ? { тип: "идти", куда: st3 } : { тип: "ждать" };
          }
        }
      }
    }

    if (!акт || typeof акт !== "object") акт = { тип: "ждать" };
    var tp = акт.тип;
    if (tp === "идти" || tp === "бить") {
      var dd = акт.куда;
      if (!(dd === "С" || dd === "Ю" || dd === "З" || dd === "В")) акт = { тип: "ждать" };
    } else if (!(tp === "взять" || tp === "положить" || tp === "ждать")) {
      акт = { тип: "ждать" };
    }

    об.m = M.join("");
    return { действие: акт, память: пм, общая: об };
  } catch (e) {
    return {
      действие: { тип: "ждать" },
      память: (в && в.память && typeof в.память === "object" && !Array.isArray(в.память)) ? в.память : {},
      общая: (в && в.общая && typeof в.общая === "object" && !Array.isArray(в.общая)) ? в.общая : {}
    };
  }
}
