我对stackoverflow比较新,我不确定是否允许我提出这类问题。基本上,我手头有一个简单的C ++ Matrix问题,我想了解其中的两件事,
a)究竟要求在这做什么?我熟悉矩阵的基础知识,我可以用C ++进行矩阵计算,但我真的不明白这个问题。
b)我绝对不是在寻找解决方案,因为我希望自己解决这个问题,相反如果有人能指出我正确的方向,那也会有所帮助。谢谢!
问题:给定3x4 int矩阵,输出一个有效方程的字符串。序列从左上角开始,以顺时针方式围绕矩阵旋转。如果不存在有效的等式,则输出“无效序列”。
E.g。
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”
感谢您的帮助。
答案 0 :(得分:0)
问题要求您在向内螺旋路径中绕过4x3矩阵,验证可以添加或减去每组两个数字以获得路径中的下一个数字 - 其中每组两个数字的第一个值是上一次操作的结果。
如果这是矩阵:
a b c d
e f g h
i j k l
然后路径是:
a b c d h l k j i e f g h
算法是:
a +- b = c
c +- d = h
h +- l = k
k +- j = i
i +- e = f
f +- g = h
如果它们都相等,那么它就是一个有效的序列。否则,您打印“无效序列”
所以你可以把程序变成一个巨大的if语句:
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"
}
如果你这样做,你不需要任何循环或任何东西。
但是像@macroland所说,你可以将2D矩阵转换为1D矩阵。如何做到这一点并不是最明显的事情,因为它不像从上到下,从左到右那么容易,但在你想到一个方法之后它是相对直接的。我能想到的最直接的前进方式是硬编码这样的路径:
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矩阵的事实。如果你这样做,你会得到与此相同的东西:
int b[13] = { 2, 3, 5, 8, -3, 10, 7, 0, 7, 5, 2, 5, -3 };
然后,您可以轻松地创建一个for循环,检查路径中的每个操作是否都有效。
如果它不总是一个4x3矩阵,你可以改变代码来动态创建路径而不是硬编码,这样这种方法可以用于任何大小的矩阵 - 一个巨大的if语句方法真的不能
我确实有一个完整的解决方案,如果您需要查看是否,但您明确要求不包含它。
现在它已经有一段时间了,这是我制作的完整程序,以防它对其他人有帮助:
#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;
}