金山不愧是金山,我大学参加过的最难的考试,看大家有没有兴趣?

boluoCTO 2003-10-25 02:03:40
两个半小时5道题,我最后一道没做.其中一道编程题是这样的.

六个数1、2、3、4、5、6,排成一列,保证相邻两数之和为素数,
第一个数与最后一个数之和也为素数,编程输出所有的组合。

金山果然是来找高手的.
...全文
80 66 打赏 收藏 转发到动态 举报
写回复
用AI写文章
66 条回复
切换为时间正序
请发表友善的回复…
发表回复
AaronTJ 2003-11-09
  • 打赏
  • 举报
回复
人工智能之产生式系统
strafer 2003-11-09
  • 打赏
  • 举报
回复
to slavik(Norns):

老弟的功底真是不错,概念很清晰,让人一看就明白你的解题思路了!

学习中。。。
shines77 2003-11-09
  • 打赏
  • 举报
回复
mark一下,有空我也写一个
michaelli 2003-11-05
  • 打赏
  • 举报
回复
给你看一下1到20的算法代码(原创)6个太简单了
#include<iostream.h>
#include<math.h>
#include<fstream.h>

int IfPrimeNum(int,int); //返回值为1表示和为素数,为0则不是
void PutOut(int *);

main()
{
int array[20]={0}; //按顺序存储该环的每个结点的数
array[0]=1;
int record[20];
for(int i=0;i<20;i++)
record[i]=1;
int flag; //标志是否满足约束,为1则不满足

int k=1;
while(k>=1&&k<20)
{
flag=-1;
if(record[k]<20)
{
record[k]++;
array[k]=record[k];
for(int i=0;i<k;i++)
{
if(array[k]==array[i])
flag=1;
}
if(IfPrimeNum(array[k-1],array[k])==0)
flag=1;
if(k==19) //考虑两头的情况
{
if(IfPrimeNum(array[0],array[k])==0)
flag=1;
}
if(flag!=1) //既满足显约束也满足隐约束
{
if(k==19) PutOut(array);
else k=k+1;
}
}
else
{
k=k-1;
record[k+1]=1;
}
}

}



int IfPrimeNum(int a,int b)
{
int sum=a+b;
int temp=sqrt(sum);

for(int i=2;i<=temp;i++)
{
if(sum%i==0)
return 0;
}
return 1;
}



void PutOut(int *x)
{
for(int i=0;i<20;i++)
cout<<x[i]<<" ";
cout<<endl;
//输出到文件中
fstream file;
file.open("letter.txt",ios::in|ios::out);
for(i=0;i<20;i++)
{
file.seekg(0,ios::end);
file<<x[i]<<" ";
}
file<<endl;
file.close();
}
结果在letter.txt文件中
zytang2003 2003-11-05
  • 打赏
  • 举报
回复
很简单,用回溯,可以直接套用<<数据结构>>教材上的例题,大概10年前我就做过,不过那时用的是BASIC,用的是数组,写完几天后,自己就看不懂了。后来再用c用回溯法写了一次,很容易的。
toyjoy 2003-11-05
  • 打赏
  • 举报
回复

强调一下,考试的时间很短,不可能想得太多!!

csyw 2003-11-03
  • 打赏
  • 举报
回复
up
FishCrazy 2003-11-03
  • 打赏
  • 举报
回复
补充一下,是亚洲区的
FishCrazy 2003-11-03
  • 打赏
  • 举报
回复
其实这就是1996年的ACM/ICPC的题C
slavik 2003-10-31
  • 打赏
  • 举报
回复
哈西表表在这里有什么用吗?

我又改了代码,深度变成3了。一次确定两个数。

// PrimeList.cpp : 定义控制台应用程序的入口点。
//

#include <stdio.h>

#define MAX_SUCC 3
#define MAX_NUM 6
#define MIN_NUM 1
#define MAP_SIZE 14
#define STACK_SIZE 3

struct node {

int a, b; //<a,b>
int succ[MAX_SUCC];

};

node g_map[] = {
{ 1, 2, 4, 6, -1 }, //0: <1,2>-><3,4>|<5,6>
{ 2, 1, 5, 7, -1 }, //1: <2,1>-><4,3>|<6,5>
{ 2, 3, 9, -1, -1 }, //2: <2,3>-><4,1>
{ 3, 2, 8, 12, 6 }, //3: <3,2>-><1,4>|<1,6>|<5,6>
{ 3, 4, 0, 12, -1 }, //4: <3,4>-><1,2>|<1,6>
{ 4, 3, 10, -1, -1 }, //5: <4,3>-><2,5>
{ 5, 6, 8, 0, -1 }, //6: <5,6>-><1,4>|<1,2>
{ 6, 5, 1, 2, -1 }, //7: <6,5>-><2,1>|<2,3>
{ 1, 4, 3, -1, -1 }, //8: <1,4>-><3,2>
{ 4, 1, 2, 10, 7 }, //9: <4,1>-><2,3>|<2,5>|<6,5>
{ 2, 5, 13, -1, -1 }, //10: <2,5>-><6,1>
{ 5, 2, 8, 12, 4 }, //11: <5,2>-><1,4>|<1,6>|<3,4>
{ 1, 6, 11, -1, -1 }, //12: <1,6>-><5,2>
{ 6, 1, 12, 10, 5 } //13: <6,1>-><2,3>|<2,5>|<4,3>
};

bool visited[] = { false,
false,false,
false,false,
false,false
};

int g_stack[] = { 0, 0, 0 };
int g_top = -1;

int g_total = 0;

bool isPrime( int num ) {

const static bool result[] = { false, //0
true, //1
true, //2
true, //3
false, //4
true, //5
false, //6
true, //7
false, //8
false, //9
false, //10
true //11
};

return result[num];
}

int pop() {

int num = g_stack[g_top];
g_top --;

return num;
}

void push( int num ) {

g_stack[++g_top] = num;
}

void printResult() {

printf( "%d, %d, %d, %d, %d, %d\n", g_map[g_stack[0]].a, g_map[g_stack[0]].b, g_map[g_stack[1]].a,
g_map[g_stack[1]].b, g_map[g_stack[2]].a, g_map[g_stack[2]].b);

g_total ++;
}

void visit( int n ) {

int succ = -1;

push( n );

visited[ g_map[n].a ] = true;
visited[ g_map[n].b ] = true;

if( g_top < 2 ) {

//continue search
int i = 0;
for( succ = g_map[n].succ[i]; succ != -1 && i < MAX_SUCC; succ = g_map[n].succ[++i] ) {
if( !( visited[g_map[succ].b] || visited[g_map[succ].a] ) ) {//visit new number pair
visit( succ );
}
}

} else {

//reached end
if( isPrime( g_map[g_stack[0]].a + g_map[g_stack[2]].b ) ) {
printResult();
}
}

visited[ g_map[n].a ] = false;
visited[ g_map[n].b ] = false;

pop();
}

int main(void)
{
for( int i =0; i < MAP_SIZE; i++ ) {

visit( i );

}

printf( "Total: %d", g_total );
getchar();

return 0;
}

v_salt 2003-10-31
  • 打赏
  • 举报
回复
可以先建立恰西表
slavik 2003-10-31
  • 打赏
  • 举报
回复
有没有全部题,我想看看。还有一个学年就要毕业了。
skywind 2003-10-31
  • 打赏
  • 举报
回复
哦,我全部做了,但是有些答得简略,都正确了呵呵
loveisbug 2003-10-31
  • 打赏
  • 举报
回复
看看
sclzmbie 2003-10-30
  • 打赏
  • 举报
回复
apogeecsj(Running(OOP+DS+AL)) 的方法就很好,才6个数用不着那么多复杂的算法。如果不是关键路径的话最简单的算法最好。
slavik 2003-10-30
  • 打赏
  • 举报
回复
不需要剪枝,也没有很多条件判断。所以会快许多。
slavik 2003-10-30
  • 打赏
  • 举报
回复
#include <stdio.h>

#define MAX_SUCC 3
#define MAX_NUM 6
#define MIN_NUM 1
#define MAP_SIZE 14

struct node {

int a, b; //<a,b>
int succ[MAX_SUCC];

};

node g_map[] = {
{ 1, 2, 2, 10, -1 }, //0: <1,2>-><2,3>|<2,5>
{ 2, 1, 8, 12, -1 }, //1: <2,1>-><1,4>|<1,6>
{ 2, 3, 4, -1, -1 }, //2: <2,3>-><3,4>
{ 3, 2, 1, 10, -1 }, //3: <3,2>-><2,1>|<2,5>
{ 3, 4, 9, -1, -1 }, //4: <3,4>-><4,1>
{ 4, 3, 3, -1, -1 }, //5: <4,3>-><3,2>
{ 5, 6, 13,-1, -1 }, //6: <5,6>-><6,1>
{ 6, 5, 11,-1, -1 }, //7: <6,5>-><5,2>
{ 1, 4, 5, -1, -1 }, //8: <1,4>-><4,3>
{ 4, 1, 0, 12, -1 }, //9: <4,1>-><1,2>|<1,6>
{ 2, 5, 6, -1, -1 }, //10: <2,5>-><5,6>
{ 5, 2, 1, 2, -1 }, //11: <5,2>-><2,1>|<2,3>
{ 1, 6, 7, -1, -1 }, //12: <1,6>-><6,5>
{ 6, 1, 0, 8, -1 } //13: <6,1>-><1,2>|<1,4>
};

bool visited[] = { false,
false,false,
false,false,
false,false
};

int g_stack[] = { 0, 0, 0, 0, 0, 0 };
int g_top = -1;

int g_total = 0;

bool isPrime( int num ) {

const static bool result[] = { false, //0
true, //1
true, //2
true, //3
false, //4
true, //5
false, //6
true, //7
false, //8
false, //9
false, //10
true //11
};

return result[num];
}

int pop() {

int num = g_stack[g_top];
g_top --;

return num;
}

void push( int num ) {

g_stack[++g_top] = num;
}

void printResult() {

printf( "%d, %d, %d, %d, %d, %d\n", g_stack[0], g_stack[1], g_stack[2], g_stack[3],
g_stack[4], g_stack[5], g_stack[6] );

g_total ++;
}

void visit( int n ) {

int b = g_map[n].b;
int succ = -1;

visited[b] = true;

push( b );

if( g_top >= 5 ) {
//reached end
if( isPrime( g_stack[0] + g_stack[5] ) ) {
printResult();
}
} else {
//continue search
int i = 0;
for( succ = g_map[n].succ[i]; succ != -1; succ = g_map[n].succ[++i] ) {
if( visited[g_map[succ].b] == false ) {//visit new number pair
visit( succ );
}
}
}

visited[b] = false;
pop();
}

int main(void)
{
for( int i =0; i < MAP_SIZE; i++ ) {
int a = g_map[i].a;
visited[a]= true;
push(a);

visit( i );

pop();
visited[a]=false;
}

printf( "Total: %d", g_total );
getchar();

return 0;
}
slavik 2003-10-30
  • 打赏
  • 举报
回复
可以按序偶搜索
可能出现的序偶为
<1,2> <2,1>
<2,3> <3,2>
<3,4> <4,3>
<5,6> <6,5>
<1,4> <4,1>
<2,5> <5,2>

每个序偶的后继为
<1,2>-><2,3>|<2,5>
<2,1>-><1,4>
<2,3>-><3,4>
<3,2>-><2,1>|<2,5>
<3,4>-><4,1>
<4,3>-><3,2>
<5,6>->NULL
<6,5>-><5,2>
<1,4>-><4,3>
<4,1>-><1,2>
<2,5>-><5,6>
<5,2>-><2,1>|<2,3>

把图建完,从每个节点开始递归走一边,把所有节点都不重复地访问到,只要首尾和为素数,就算出来了。

利用数据结构直接避免前后只和为素数地判断,提高效率,算法实现也简化了。如果动态改变图的状态,给每个节点加一个标志,那么没加入一个新的节点<,a>就把所有<x,a>的节点置为false,初始时(从<a,b>开始>必须把所有<x,a>和<x,b>的节点置为false,x为任意值。

节点描述如下

struct node {
int a, b; //<a,b>
int succ[3]; //succ = -1表示结束
bool enable;
}



struct node g[12] = {//之前说的数据};



xiaonian_3654 2003-10-30
  • 打赏
  • 举报
回复
我靠,很简单啊,
这都不会,就不要出去混了,
我就纳闷,为什么程序员掉价
原来菜鸟太多了,
哎,害的我吃窝窝头
caohoujie 2003-10-30
  • 打赏
  • 举报
回复
To winco(老狼):

如果你看了我的代码,你很可能就不会
把你的东东贴出来啦
加载更多回复(46)

33,029

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧