日期:2014-05-19  浏览次数:20774 次

求算法!
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)? ";