首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >旋转编码的3x3矩阵/列表

旋转编码的3x3矩阵/列表
EN

Stack Overflow用户
提问于 2020-12-06 14:48:41
回答 1查看 103关注 0票数 1

假设有一个编码的3x3平面:

代码语言:javascript
运行
复制
1 2 3   
4 5 6  
7 8 9  

在顺时针旋转之后,它变成:

代码语言:javascript
运行
复制
7 4 1
8 5 2
9 6 3

要将前者转换为后者,一个明显的方法是这样做:

代码语言:javascript
运行
复制
 switch (num) {
     case 1: return 7; break;
     case 2: return 4; break;
     ...
 }

例如,[1, 5, 6, 9]给出了[7, 5, 2, 3]

不管怎么说,没有硬编码就可以这么做吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-06 15:13:44

将值转换为新值的函数将到达相同的位置,您可以使用以下定义的函数(在JavaScript中):

代码语言:javascript
运行
复制
function rotated(num) {
    num--; // convert to zero-based number
    return 1 + (2 - num % 3) * 3 + Math.floor(num / 3);
}

// demo: print original and new value next to each other:
for (let num = 1; num <= 9; num++) {
    console.log(num, rotated(num));
}

后续行动

在评论中,你问我是如何想出这个解决方案的。

有几种方法可以达到这个目的,但我认为是这样的:

我想知道:如果我知道给定数字出现的行和列,那么从哪里获得新值的行和列将是什么?

例如,3出现在第0行和第2列(基于零的索引编号中).我需要的值位于第0行和第0列中。通过播放行和列,您会发现第0行中的所有条目都将从列0中获得它们的新值。类似地,第1行中的那些将从第1列中获得它们的新值。

与列号也有一个关系:列0中的所有条目从第2行获得它们的新值,第1列从第1行获得它们,列2中的条目从第0行获得它们。所以这里我们有一个逆关系。

因此,给出一个数字,需要采取的步骤是:

principle)

  • Derive

  • 派生自给定的行数和列(

  • 从这些行和列索引中派生出的其他行和列索引,其中新值位于其中)(从位于该值的另一行和列的上述

派生并返回该值。

到目前为止,我一直专注于第二步的细节。第一步应该很容易。给定的num出现的列索引是(num-1) % 3 (模运算符)。行索引是(num-1)/3 (整数除法)。

步骤3应该做逆运算:将行索引乘以3并添加列索引。这就提供了一个基于零的值,因此应该将1添加到它中。

所有这些都会导致以下代码:

代码语言:javascript
运行
复制
function rotated(num) {
    num--; // convert to zero-based number
    // Step 1: derive row and column
    let col = num % 3;
    let row = Math.floor(num / 3);
    // Step 2: derive other row and column
    let valueCol = row;
    let valueRow = 2 - col; // opposite direction
    // Step 3: which value sits there?
    let value = valueRow * 3 + valueCol + 1;
    // Return that
    return value;
}

// demo: print original and new value next to each other:
for (let num = 1; num <= 9; num++) {
    console.log(num, rotated(num));
}

最后一步是减少程序中使用的变量数.这导致了上面的第一个片段。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65169356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档