各位高手帮忙,算法研究,有难度的说,专拣编程的最好别进,以免信心受挫<1000分>

phsea 2004-10-12 09:22:39
问题是这样的:
假如有4组数据,每组数据都是{1,2,3,4},组成一个矩阵,即:
{
{1,2,3,4},
{1,2,3,4},
{1,2,3,4},
{1,2,3,4},
}

这样一个正方形矩阵,我现在要从每组数据中取出一个,组合成一个新的数据,
那我怎么样得到所有的新数据呢?如,{1,1,1,1},{1,2,1,1}.......
不论语言,程序实现即可。绝对1000分,如果嫌少,我再加,我最近来这里少了,
只要回答了,我就给分,分10次,都可以回答,每个答案都可以给1000,我有6000分,我还有个账号也有8000分,谢谢先!
也可以发到email:flyjava@163.com,
告诉我你的csdn账号,我会给你分
...全文
1341 点赞 收藏 81
写回复
81 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
庄鱼 2004-10-30
虽已结贴,但还是将错误的代码订正一下:
bool Fn1(int* A,int n,int m)
{
if (0>m) return true;
if(A[m]+1 == n){
A[m]=0;
return Fn1(A,n,m-1);}
else A[m]++;
return false;
}

void Fn(int n)
{
int *Num = new int[n];
for(int i=0;i<n;i++)Num[i]=0;
//---------------------
for(;;){
for(int i=0;i<n;i++)
cout<<Num[i]+1<< " ";
if(Fn1(Num,n,n-1))break;
cout << endl;}
delete []Num;
}
回复
庄鱼 2004-10-23
上述代码修正一下:
void Fn(int n)
{
int *Num = new int[n];
for(int i=0;i<n;i++)Num[i]=0;
//---------------------
for(;;){
for(int i=0;i<n;i++)
cout<<Num[i]+1<< " ";
if(Fn1(Num,n,n-1))break;
cout << endl;}
delete []Num;
}
回复
庄鱼 2004-10-23
给个简单的算法,以满足任意数枚举问题:
//=== 进位处理程序 解决数据溢出
bool Fn1(int *A,int n,int m)
{
if (0<m) return false;
if(A[m]+1 == n){
A[m]=0;
return Fn1(A,n,m-1);}
else A[m]++;
return true;
}

void Fn(int n)
{
int *Num = new int[n];
for(int i=0;i<n;i++)Num[i]=0;
//---------------------
for(;;){
for(int i=0;i<n;i++)
cout<<Num[i]+1<< " ";
if(Fn1(Num,n,n-1))break;
cout << endl;}
}
身边没有环境,各位帮忙验证一下
回复
burn3tt 2004-10-23
简单不能再简单的穷举问题(只针对此题):楼上很多人会出现数组越界的问题
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
for(int l=1;l<=4;l++)
for(int k=1;k<=4;k++)
再加入一个判断语句,过滤条件,输出就可以了
回复
phsea 2004-10-23
看看这个谢谢大家了

import java.util.Vector;

public class Test {
public Test(){

}
public Vector getArray(Vector vec,int index,String[] data){
if(index < data.length){
Vector result = new Vector();
for(int i = 0 ; i < vec.size() ; i++){
for(int j = 0 ; j < data[index].length() ; j++){
String temp = (String) vec.elementAt(i);
result.addElement(temp+String.valueOf(data[index].charAt(j)));
}
}
return getArray(result,index+1,data);
}
return vec;
}
public static void main(String[] args){
String[] forTest = {"13","12","20","1","30","13","32"};
Test test = new Test();
Vector vec = new Vector();
vec.addElement("");
Vector result = test.getArray(vec,0,forTest);
System.out.println("all "+result.size());
for(int i = 0 ; i < result.size() ; i++){
System.out.println(result.elementAt(i).toString());
}
}

}
回复
albertlee 2004-10-22
我现在可用分是8000多分, 晕那。本来想散光分就离开这里
回复
helanshan 2004-10-22
来段VB的:
Private Sub Command1_Click()
Dim i, j, k, m, n As Integer
n = 4
For i = 1 To n
For j = 1 To n
For k = 1 To n
For m = 1 To n
Debug.Print i & j & k & m
Next
Next
Next
Next
End Sub
回复
yangfasheng 2004-10-22
这么多,先mark,下次来看,
回复
phsea 2004-10-22
谢谢,我领教了,我也觉得自己过分了,

各位别这么说,我不认为分多就了不起?而是我觉得这个问题对我来说很重要
我就觉得分多少都值,最近在学习算法,很有意思
没有别的意思

谢谢大家了,
回复
zyq4 2004-10-22
只为实现输出可以这样:
#include <stdio.h>
#include <stdlib.h>
void main()
{
int x[4][4]=
{
{1,2,3,4},
{1,2,3,4},
{1,2,3,4},
{1,2,3,4},
};
for(int i=0; i<4; i++)
for(int j=0; j<4; j++)
for(int k=0; k<4; k++)
for(int m=0; m<4; m++){
if((x[0][i]==1)&&(x[0][j]==2)&&(x[0][k]==3)&&(x[0][m]==4)){
}else{
printf("{%d,%d,%d,%d,}\n",x[0][i],x[1][j],x[2][k],x[3][m]);
}
}
}
回复
一路奔跑 2004-10-22
分多了不起啊~~
回复
liudancodeman 2004-10-22
风舞轻扬,你的Delphi的代码我都看懂了,我觉得你的解决方法是非常有效的,其实这样的时间复杂性O(m^n)是不可避免的
回复
windindance 2004-10-21
to phsea:
>>连续发了8个贴给分
是不允许的。你发一、两个贴也就是了,发这么多,版主当然会删除的。:)
回复
albertlee 2004-10-21
我支持: yuexialinfeng(临风伴月)

说实话,楼主哗众取宠了。
回复
phsea 2004-10-21
我考,我的信誉值?上次我来还是100,而且我连续发了8个贴给分,结果好像都被删除了,
我倒!!!!不过我已经发了700分出去了,我在这里交流,当然要散分给回答的人,多少分,
是我的事,没必要管巴,我做人很厚道地
回复
yuexialinfeng 2004-10-21
我粗略得看了下楼上众多人的发帖,我感到好笑。。。
先说楼主,出了个暴力题,就算是给出可扩展的,那又有什么难的呢?稍微有点水平的大二,大三的都能写。要高效,更是奇怪,搜索所有的值也有高效的???我还是头一次听说,真正高效是出现在找最优值上的,不是穷举!!!
而更可笑的是居然有人直接给出用for循环的。。。。
楼主不是说了么,得到一个新数,也就是重复的不算,楼上的有几个判断重复的了。
这个题目难的不是写出可以扩展的,也不是找出组合,而是写出高效的,可判重的代码。
判重复怎么判呢?
菜鸟说,每个比较下来就好了。。。
要知道,这个有可能是组合爆炸,线性的时间最差!
懂一点数据结构的人说,用set,也就是树。。。
这个好点,起码是O(lonN),不过也不行。
最好的是常数O(1).
怎么做呢?
其实只用将字符或者是数字编码化,到时候直接查表就行了,其实编码化所需的时间是很少的。
不过在判重这点上编码的方法是比较难泛化的。这就是需要程序员做的事情。
呵呵,不说了,我怕有人要杀我。。。
回复
greenteanet 2004-10-21
#include <iostream>
using namespace std;

int main()
{
int x[4][4]=
{
{1,2,3,4},
{1,2,3,4},
{1,2,3,4},
{1,2,3,4},
};
for(int a=0; i<4; ++i)
for(int b=0; j<4; ++j)
for(int c=0; k<4; ++k)
for(int d=0; m<4; ++m)
cout<<"{"<<x[0][a]<<x[1][b]<<x[2][c]<<x[3][d]<<"}"<<endl;
return 0;
}
回复
LatestFantasy 2004-10-17
VC6.0 /dev c++ 测试通过:

#include <iostream>
#include <list>
using namespace std;
typedef char mytype;
typedef list<mytype *> data;
typedef list<data *> dataset;

void PushData(dataset *pds,mytype *pdb,mytype *pde)
{
data *dlist=new data;
mytype *pdc=pdb;
while(pdc<pde)dlist->push_back(pdc++);
pds->push_back(dlist);
}
void ShowData(dataset *pds)
{
dataset::iterator dic=pds->begin(),die=pds->end();
data *mydata;
mytype *pt;
while(dic!=die)
{
data::iterator idc=(*dic)->begin(),ide=(*dic)->end();
while(idc!=ide)cout << **idc++;
cout << endl;
dic++;
}
}
dataset *GenSet(dataset *pds)
{
dataset::size_type sz=pds->size();
if(!sz){return NULL;}
data::iterator pmyc=0,pmye=0;
if(sz==1)
{
data *pd=*(pds->begin());
if(!pd->size()){return NULL;}
pmyc=pd->begin();pmye=pd->end();
dataset *pds1=new dataset;
while(pmyc!=pmye){
data *pdn=new data;
pdn->push_back(*pmyc);
pds1->push_back(pdn);
pmyc++;
}
return pds1;
}
dataset::iterator ids=pds->begin();
dataset::size_type idsi=0,idss=pds->size()-1,idstmp;
while(idsi++<idss)ids++;
data *ed=*ids;
data *nd=0;
mytype *nm=0;
if(!ed->size())return NULL;
pds->pop_back();
dataset *pdsx=GenSet(pds);
dataset::iterator pdsib=pdsx->begin(),pdsic,pdsie=pdsx->end();
data::iterator pdib,pdie,pdic;
pmyc=ed->begin();pmye=ed->end();
pmyc++;
idss=pdsx->size();
while(pmyc!=pmye)
{
pdsic=pdsib;
idsi=0;
while(idsi++<idss)
{

nd=new data;
pdic=(*pdsic)->begin();pdie=(*pdsic)->end();
while(pdic!=pdie){
nd->push_back(*pdic);
pdic++;
}
nd->push_back(*pmyc);
pdsx->push_back(nd);
pdsic++;
}
pmyc++;
}
pmyc=ed->begin();
pdsic=pdsib;
idsi=0;
while(idsi++<idss)
{
(*pdsic)->push_back(*pmyc);
pdsic++;
}
return pdsx;
}
void FreeData(dataset *ds)
{
if(!ds)return;
dataset::iterator pdsc=ds->begin(),pdse=ds->end();
data *pd;
while(pdsc!=pdse){pd=(*pdsc);pd->clear();delete pd;pdsc++;}
ds->clear(); delete ds;
}

int main(){
dataset *pds=new dataset;
mytype *pd;
pd="1234"; PushData(pds,pd,pd+4);
pd="1234"; PushData(pds,pd,pd+4);
pd="1234"; PushData(pds,pd,pd+4);
pd="1234"; PushData(pds,pd,pd+4);
pd="12345"; PushData(pds,pd,pd+5);

dataset *test=GenSet(pds);
ShowData(test);
FreeData(test);

system("pause");
}
回复
greenteanet 2004-10-17
怎么楼主的信誉分那么低啊?
回复
IDispatchwang 2004-10-17
Leaveye(~枝)(完全了解系统,也要实际量测性能)
的方法很好啊,我觉得强过递归的解法。
容易理解,有可能性能也比递归的强。
回复
加载更多回复
相关推荐
发帖
新手乐园
创建于2007-09-28

3.3w+

社区成员

C/C++ 新手乐园
申请成为版主
帖子事件
创建了帖子
2004-10-12 09:22
社区公告
暂无公告