麻烦大神看一下这段代码有什么错误,请求指点

求指点!!!!!

/*
 * 有n=2^k个远动员选手,设计比赛日程表实现:
 *(1)每个选手必须与n-1个选手比赛
 *(2)每个选手一天只比赛一场
 *(3)比赛共进行n-1天
 * 输入:n人
 * 输出:n行n-1列,第i行第j列表示第i个选手第j天遇到的对手,不包含第一列表示为选手编号
*/

/*
将n*n个格子,也就是n阶方阵从中间十字划分,一次划分分成四块,令其右上角和左下角的数据完全相同,右下角和左上角的数据完全相同;每次划分都得到了若干个n/2阶的方阵,然后对这些方阵进行操作,继续令其右上角和左下角的数据完全相同,右下角和左上角的数据完全相同,如此循环下去,直至n<2时结束递归。
*/

console.time("Summary");

function twoDimetionalArr(m) {
    m = m + 1;
    var tArray = []; //先声明一维
    for (let f = 0; f < m; f++) { //一维长度为i,i为变量,可以根据实际情况改变
        tArray[f] = []; //声明二维,每一个一维数组里面的一个元素都是一个数组;
        for (let g = 0; g < m; g++) { //一维数组里面每个元素数组可以包含的数量p,p也是一个变量;
            tArray[f][g] = 0; //这里将变量初始化,我这边统一初始化为空,后面在用所需的值覆盖里面的值
        }
    }
    return tArray;
}

function gameTable(k) {
    var gameArr = twoDimetionalArr(k);
    var n = 2;
    var temp = 0;
    var i = 0;
    var j = 0;
    gameArr[1][1] = 1;
    gameArr[1][2] = 2;
    gameArr[2][1] = 2;
    gameArr[2][2] = 1;
    console.log(gameArr);

    for (var t = 1; t < k; t++) {
        temp = n;
        n = n * 2;

        for (i = temp + 1; i <= n; i++) {
            for (j = 1; j <= temp; j++) {
                gameArr[i][j] = gameArr[i - temp][j] + temp; //左下角和左上角元素的对应关系
            }
        }

        for (i = 1; i <= temp; i++) { //将左下角元素抄到右上角
            for (j = temp + 1; j <= n; j++) {
                gameArr[i][j] = gameArr[i + temp][(j + temp) % n];
            }
        }
        for (i = temp + 1; i <= n; i++) { //将左上角元素抄到右下角
            for (j = temp + 1; j <= n; j++) {
                gameArr[i][j] = gameArr[i - temp][j - temp];
            }
        }
    }
    return gameArr;
}

var arrangeArr = gameTable(8);
console.log(arrangeArr);

console.timeEnd("Summary");

clipboard.png

阅读 3.2k
3 个回答

图片描述

算法我不想去研究了, @ted423 已经告诉了你问题所在,数组一共9个元素,你的 i 都已经是 9 了,取得到的肯定是 undefined

使用调试方法,或者通过 console.log 把相关的一些值输出来看看就能发现错误在哪里,再回去分析推敲一下原因,应该是能解决问题的。

思考了下,抽象出来就是把1~n个数字填充到一个n*n的格子中,并且每行每列数字之和都相同但不重复填充,然后去掉第一行就是你要的结果。

//得到二维数组
function sum(n){
    if(n<2){
        throw new Error('最少两个人');
    }
    let arr = [];
    for(var i = 0;i<n;i++){
        arr[i] = [];
        var temp = i;
        for(var j = 0;j<n;j++){
            ++temp;
            if(temp<n){
                arr[i][j] = temp+1;
            }else{

                arr[i][j] = temp-n+1;
            }
        }
    }
    return arr;
}
let result = sum(n).shift(0);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题