首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++矩阵串

C++矩阵串
EN

Stack Overflow用户
提问于 2016-02-09 01:03:43
回答 1查看 1.6K关注 0票数 0

我对堆叠溢出比较陌生,我不知道是否允许我问这些问题。基本上,我手头有一个简单的C++矩阵问题,我想了解其中的两件事,

( a)这里究竟要求做什么?我熟悉矩阵的基本知识,我可以在C++中进行矩阵计算,但我并不真正理解这个问题本身。

我绝对不是在寻找解决办法,因为我希望自己解决这个问题,相反,如果有人能给我指明正确的方向,那也是有帮助的。谢谢!

问题:给定一个3x4 int矩阵,输出一个有效的字符串。序列从左上角开始,以顺时针的方式绕矩阵旋转。如果一个有效的方程不存在,输出“无效序列”。

例如。

代码语言:javascript
复制
2   3  5  8
5   2  5  -3
7   0  7  10

这将形成一个序列:"2 +3=5-8= -3 + 10 =7+0=7-5=2-5= -3“。

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-09 06:56:22

这个问题要求你在向内螺旋路径中绕4x3矩阵旅行,以验证每组两个数字是否可以加或减,以得到路径中的下一个数字--其中每组两个数字的第一个值是上一次操作的结果。

如果这是矩阵:

代码语言:javascript
复制
a b c d
e f g h
i j k l

然后这条路是:

代码语言:javascript
复制
a b c d h l k j i e f g h 

算法是:

代码语言:javascript
复制
a +- b = c
c +- d = h
h +- l = k
k +- j = i
i +- e = f
f +- g = h

如果它们都是相等的,那么它就是一个有效序列。否则,打印“无效序列”。

所以你可以把这个程序变成一个巨大的if语句:

代码语言:javascript
复制
if( (a + b == c || a - b == c) &&
    (c + d == h || c - d == h) &&
    (h + l == k || h - l == k) &&
    (k + j == i || k - j == i) &&
    (i + e == f || i - e == f) &&
    (f + g == h || f - g == h) )
{
    // print the path
}
else
{
    // print "invalid sequence"
}

如果你这样做,你不需要任何循环或任何东西。

但是就像宏兰德说的,你可以把二维矩阵转换成一维矩阵。如何做到这一点并不是最显而易见的事情,因为它并不像从上到下,从左到右,但在你想到一个方法之后,它是相对直接的。我能想到的最正确的方法是硬编码所走的路径:

代码语言:javascript
复制
int a[3][4] = {{ 2, 3, 5,  8 },
               { 5, 2, 5, -3 },
               { 7, 0, 7, 10 }};
int b[13]; // the output array
int x[13] = {0,1,2,3,3,3,2,1,0,0,1,2,3};
int y[13] = {0,0,0,0,1,2,2,2,2,1,1,1,1};
for(int i=0;i<13;i++) b[i]=a[y[i]][x[i]];

当然,这取决于你知道它总是一个4x3矩阵的事实。如果你这样做了,你就会得到相当于这样的东西:

代码语言:javascript
复制
int b[13] = { 2, 3, 5, 8, -3, 10, 7, 0, 7, 5, 2, 5, -3 };

然后,您可以轻松地创建一个for循环,检查路径中的每个操作是否有效。

如果它并不总是一个4x3矩阵,您可以更改代码来动态地创建路径,而不是硬编码,这样这种方法就可以与任意大小的矩阵一起工作--这是一个巨大的If语句方法实际上无法做到的。

我有一个完整的解决方案,如果你需要看是否,但你明确要求它不包括在内。

编辑:

现在已经有一段时间了,下面是我编写的一个完整的程序,以防它对其他人有帮助:

代码语言:javascript
复制
#include <sstream>
#include <iostream>

int a[3][4] = {{ 2, 3, 5, 8},
               { 5, 2, 5,-3},
               { 7, 0, 7,10}};

int b[13];

void convert_array()
{
    int x[13] = {0,1,2,3,3,3,2,1,0,0,1,2,3};
    int y[13] = {0,0,0,0,1,2,2,2,2,1,1,1,1};
    for(int i=0;i<13;i++) b[i]=a[y[i]][x[i]];
}

int main()
{
    std::stringstream s;
    convert_array();
    s << b[0];
    for(int i=1;i<12;i+=2)
    {
        if(b[i-1]+b[i]==b[i+1])
            s << " + " << b[i] << " = " << b[i+1];
        else if(b[i-1]-b[i]==b[i+1])
            s << " - " << b[i] << " = " << b[i+1];
        else
        {
            std::cout << "invalid sequence" << std::endl;
            break; // return 1;
        }
    }
    std::cout << s.str() << std::endl;
    return 0;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35282239

复制
相关文章

相似问题

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