求助一个算法问题!

发布于 2022-09-11 20:24:06 字数 894 浏览 12 评论 0

clipboard.png
求大佬解答下...

const defaultRows = 3;
const defaultColnums = 3;
const items = [
  { name: 1, row: 1, colnum: 3 },
  { name: 2, row: 1, colnum: 1 },
  { name: 3, row: 2, colnum: 2 },
  { name: 4, row: 2, colnum: 1 },
  { name: 5, row: 1, colnum: 1 },
  { name: 6, row: 1, colnum: 1 },
  { name: 7, row: 1, colnum: 1 },
  { name: 8, row: 1, colnum: 1 },
  { name: 9, row: 1, colnum: 1 }  
]

/**
 * 获取实际生成的行列数
 * @param {number} drs 默认的行数
 * @param {number} dcs 默认的列数
 * @param {array} ary 数据
 */
function getRealVal(drs, dcs, ary) {
  ...
  return {
    colnums: ?,
    rows   : ?
  }
}

// 需要的结果
getRealVal(defaultRows, defaultColnums, items); // => { colnums: 3, rows: 5 }

在补充个图

clipboard.png

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

秋心╮凉 2022-09-18 20:24:06

我这是利用二维数组填充标识求最终结果,可以利用result的结果来画图,如果不用画图仅需colnums rows 应该是有算法能直接得到值的,但暂时没想到

const defaultRows = 3;
const defaultColnums = 3;
const items = [
  {name: 1, row: 1, colnum: 3},
  {name: 2, row: 1, colnum: 1},
  {name: 3, row: 2, colnum: 2},
  {name: 4, row: 2, colnum: 1},
  {name: 5, row: 1, colnum: 1},
  {name: 6, row: 1, colnum: 1},
  {name: 7, row: 1, colnum: 1},
  {name: 8, row: 1, colnum: 1},
  {name: 9, row: 1, colnum: 1},
];

/**
 * 获取能够填充的初始列数据
 * @param arr
 * @param colnum
 * @param row
 * @returns {{index: number, cols: Array}}
 */
function findRows(arr, colnum, row) {
  const result = {
    index: -1,
    cols: [],
  };
  for (let rI = 0; rI < arr.length; rI++) {
    const rows = arr[rI];
    result.index = -1;
    result.cols = [];
    for (let cI = 0; cI < rows.length; cI++) {
      if (!rows[cI]) {
        result.cols.push(cI);
        if (result.cols.length === colnum) {
          if (rI === arr.length - 1 || !arr.some((_rows, _i) =>
            _i > rI && _i < row && result.cols.some(index => !!_rows[index]))
          ) {
            result.index = rI;
            return result;
          } else {
            result.cols.splice(0, 1);
          }
        }
      } else {
        result.cols = [];
      }
    }
    if (result.cols.length === colnum) {
      if (rI === arr.length - 1 || !arr.some((_rows, _i) =>
        _i > rI && _i < row && result.cols.some(index => !!_rows[index]))
      ) {
        result.index = rI;
        return result;
      }
    }
  }
  result.index = arr.length;
  result.cols = new Array(colnum).fill(0).map((v, i) => i);
  return result;
}

/**
 * 获取实际生成的行列数
 * @param {number} drs 默认的行数
 * @param {number} dcs 默认的列数
 * @param {array} ary 数据
 */
function getRealVal(drs, dcs, ary) {
  let colnums = 0;
  const result = [];
  for (let item of ary) {
    const {index, cols} = findRows(result, item.colnum, item.row);
    for (let i = 0; i < item.row; i++) {
      if (!result[index + i]) result[index + i] = new Array(dcs);
      for (let col of cols) {
        result[index + i][col] = item.name;
        if (col + 1 > colnums) colnums = col + 1;
      }
    }
  }
  return {
    colnums,
    rows: result.length,
    result,
  };
}

// 需要的结果
const res = getRealVal(defaultRows, defaultColnums, items); 

console.log(res);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文