求算法!
n=1
输出:
1 2
3 4
n=2
输出:
11 12 21 22
13 14 23 24
31 32 41 42
33 34 43 44
n=3:
111 112 121 122 211 212 221 222
113 114 123 124 213 214 223 224
131 132 141 142 231 232 241 242
133 134 143 144 233 234 243 244
311 312 321 322 411 412 421 422
313 314 323 324 413 414 423 424
331 332 341 342 431 432 441 442
333 334 343 344 433 434 443 444
希望用for循环输出,不要递归,谢谢!
------解决方案--------------------规律很明显
[1 2
3 4] 是一个矩阵,不妨当作元矩阵,每次循环都是在上一个矩阵的元素上‘乘’以元矩阵,
1*[1 2 = [11][12]
3 4] [13][14] ...
看出来了吧?
关键处是定义‘乘’操作算法,goodLuck!
:)
------解决方案--------------------int n = 3;
int nn = 1 < < (n * 2);
for (int i = 0; i < nn; i++)
{
for (int j = n - 1; j > = 0; j--)
{
Console.Write((i > > (n + j)) % 2 * 2 + ((i % (1 < < n)) > > j) % 2 + 1);
}
Console.Write( " ");
if ((i + 1) % (1 < < n) == 0) Console.WriteLine();
}
enjoy
------解决方案--------------------根据雪弓刀矩阵运算的提示想出了如下解法,源码如下供大家参考:
#include "stdafx.h "
#include <string>
#include <vector>
#include <iostream>
using namespace std;
typedef vector <string> strVector;
struct strMat
{
strVector sv;
short r;
short c;
};
void stringMult(const strMat& M1,strMat& M2)
{
strVector sv1=M1.sv;
strVector sv2=M2.sv;
size_t s1=sv1.size();
size_t s2=sv2.size();
strMat Result;
Result.r=M1.r*M2.r;
Result.c=M1.c*M2.c;
Result.sv.clear();
Result.sv.resize(s1*s2);
for(short i=0;i <s1;++i)
for(short j=0;j <s2;++j)
{
string eleStr=sv1[i]+sv2[j];
short eleR=i/M1.c*M2.r+j/M2.c;
short eleC=i%M1.c*M2.c+j%M2.c;
Result.sv.at(eleR*Result.c+eleC)=eleStr;
}
M2=Result;
}
void getResult(short& dim,const strMat& mMat)
{
char flag=0;
do
{
cout < < "请输入维数: ";
cin> > dim;
assert(dim> 0 && dim <=20);
if(dim==1)
{
for(int i=0;i <mMat.r;++i)
{
for(int j=0;j <mMat.c;++j)
cout < <mMat.sv[i*mMat.c+j] < < " ";
cout < <endl;
}
}
else
{
strMat resultMat=mMat;
for(int i=1;i <dim;++i)
stringMult(mMat,resultMat);
for(i=0;i <resultMat.r;++i)
{
for(int j=0;j <resultMat.c;++j)
cout < <resultMat.sv[i*resultMat.c+j] < < " ";
cout < <endl;
}
}
cout < < "是否退出程序(y/Y)? ";