算法:解三阶幻方

题目:3X3 的九宫格,每个横竖斜相加都等于15,使用1-9数字。

要求:编程语言,1-9数字不重复。

function nMagic({ time = 3, sum = 15, from = 1, to = 9 } = {}) {
  const loop = ({
    results = [],
    arrs = [],
    time = 1,
    on = 1,
    from = 1,
    to = 4,
    fn = null
  }) => {
    for (let i = from; i <= to; i++) {
      let add = [].concat(arrs, i);
      if (on < time) {
        results = loop({
          results,
          arrs: add,
          time,
          on: on + 1,
          from,
          to,
          fn
        });
      } else {
        if (fn) {
          if (fn(add)) {
            results.push(add);
          }
        } else {
          results.push(add);
        }
      }
    }
    return results;
  };

  var expression = loop({
    time,
    from,
    to,
    fn(add) {
      let obc = {};
      let has = false;
      let n = 0;
      add.map(v => {
        if (obc[v]) has = true;
        else obc[v] = true;
        n += v;
      });
      return !has && n === sum;
    }
  });

  var combo = [];

  loop({
    time,
    from: 0,
    to: expression.length - 1,
    fn(add) {
      let no = false;

      let arr = [];
      let temp = [];
      let obc = {};
      add.map(v => {
        arr.push(expression[v]);
        temp = [].concat(temp, expression[v]);
      });

      // 是否重复项目
      temp.map(v => {
        if (obc[v]) no = true;
        else obc[v] = true;
      });
      if (no) return false;

      // 是否竖着的值满足条件
      for (let i = 0; i < time; i++) {
        let n = 0;
        arr.map(item => {
          n += item[i];
        });
        if (n !== sum) return false;
      }

      // 是否斜着的值满足条件
      let xiezhe1 = 0;
      let xiezhe2 = 0;
      arr.map((item, j) => {
        xiezhe1 += item[j];
        xiezhe2 += item[arr.length - j - 1];
      });
      if (xiezhe1 !== sum || xiezhe2 !== sum) return false;

      combo.push(arr);
      return true;
    }
  });

  return combo;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 作者:杨舸 跟数独游戏的结缘,是一次次的空中飞行。经常出差,如何消磨旅途时间?航空杂志都翻烂了,小说也不是每次出差...
    Sting阅读 14,554评论 1 8
  • 每次回家,迎接自己的那个女人,总是满脸的笑容。而看到家里总是被她收拾得干干净净的,心里有种说不出来的感觉。...
    鲁廉羽昕阅读 1,605评论 0 1
  • 文/宁宇霄 纪楠说,他已经整整一年没怎么见过姑娘了。所以看到晾衣杆上的那件红裙,就像是在沙漠里濒死的时候,看到了一...
    流噪阅读 4,837评论 3 3
  • 1.刚刚做了个彩超,小生命挺好的,等着下午验血报告,我相信他跟他妈妈一样,很厉害的。迫不及待的想跟老公分享… 2....
    苏远1阅读 877评论 0 1
  • https://a.meipian.cn/6cbhm4s
    一溪风月阅读 1,482评论 0 0