求助一个算法问题!

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

阅读 1.6k
1 个回答

我这是利用二维数组填充标识求最终结果,可以利用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);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题