2005年软件设计师考试题目预测(zz)

Posted on 2005-05-24 19:19 蜗牛 阅读(149) 评论(0)  编辑  收藏 所属分类: pages(zz)
  1 一笔画问题 

    2 迷宫问题 

    3 最短路径问题(就是给出一个交通示意图,边上的数字为路的长度,求每个结点到某个固定点的最短路程) 

    4 N个球称重问题吧 

    荷兰国旗问题????四色定理 

    3种颜色(0,1,2)在一个数组里,每次只可交换一次,扫描一边后,三种颜色自然分开,应为颜色为:红,白,蓝,(荷兰国旗的颜色)所以叫它荷兰国旗问题(也是他老人家的国籍)! 

#include "stdio.h" 
#include "stdlib.h" 
#include "time.h" 

#define N 15 

int main(int argc, char* argv[]) 

char array[N]; 
char t,*p_red_end,*p_write_end,*p_blue_head; //分别为红色的尾指针、白色的尾指 

    针、蓝色的首指针 

int i; 

srand( (unsigned)time( NULL ) ); 
for(i=0;i<N;i++) 

switch (rand()%3) 

case 0:  
array=’r’; 
break; 
case 1: 
array=’w’; 
break; 
default: 
array=’b’; 

printf("%c ",array); 

printf("\n"; 

for(p_red_end=p_write_end=array,p_blue_head=array+14;p_write_end<=p_blue_head 
switch (*p_write_end) 

case ’r’: 
t=*p_red_end; 
*p_red_end=*p_write_end; 
*p_write_end=t; 
p_red_end++; 
p_write_end++; 
break; 
case ’b’: 
t=*p_write_end; 
*p_write_end=*p_blue_head; 
*p_blue_head=t; 
p_blue_head--; 
break; 
default: 
p_write_end++; 

for(i=0;i<N;i++) 
printf("%c ",array); 

运行结果是: 
rrrwwrwwrwbbbbb 

    这个结果是荷兰国旗算法的结果吗?(我不清楚荷兰国旗算法) 

    题目最终要求的结果应该是:红,白,兰,红,白,兰,红,白,兰……还是:红,红,红,红,红,白,白,白,白,蓝,蓝,蓝,蓝,蓝……? 

#include "stdio.h" 
#define k 15 /*假定数组有15个数*/ 
char a[k]={’r’,’w’,’b’,’r’,’r’,’b’,’w’,’w’,’b’,’b’,’b’,’w’,’r’,’r’,’w’}; /*r,b,w代表红, 

    蓝,白*/ 

main() 
{int i,ii; 
char t; 
int m,n,p; 
m=0; /*m为红色末尾指针*/ 
n=0; /*n为白色末尾指针*/ 
p=14;/*p为蓝红色头指针*/ 
for (ii=0;ii<15;ii++) 
printf("%c",a[ii]); 
while(n<=p) 

if (a[n]==’r’) {t=a[n];a[n]=a[m];a[m]=t;m++;n++;} 
else if (a[n]==’w’) n++; 
else { 
t=a[n];a[n]=a[p];a[p]=t;p--;n++; 
if (a[n-1]==’r’) {t=a[n-1];a[n-1]=a[m];a[m]=t;m++;} 


for (i=0;i<15;i++) 
prinrf("%s",a[n]); 



  货郎问题???? 

    一笔画问题 

const max=6;{顶点数为6} 
type shuzu=array[1..max,1..max]of 0..max; 
const a:shuzu {图的描述与定义 1:连通;0:不通} 
=((0,1,0,1,1,1), 
(1,0,1,0,1,0), 
(0,1,0,1,1,1), 
(1,0,1,0,1,1), 
(1,1,1,1,0,0), 
(1,0,1,1,0,0)); 
var 
bianshu:array[1..max]of 0..max; {与每一条边相连的边数} 
path:array[0..1000]of integer; {记录画法,只记录顶点} 
zongbianshu,ii,first,i,total:integer;  

procedure output(dep:integer); {输出各个顶点的画法顺序} 
var sum,i,j:integer; 
begin 
inc(total); 
writeln(’total:’,total); 
for i:=0 to dep do write(Path);writeln; 
end; 


function ok(now,i:integer;var next:integer):boolean;{判断第I条连接边是否已行过} 
var j,jj:integer; 
begin 
j:=0; jj:=0; 
while jj<>i do begin inc(j);if a[now,j]<>0 then inc(jj);end; 
next:=j; 
{判断当前顶点的第I条连接边的另一端是哪个顶点,找出后赋给NEXT传回} 
ok:=true; 
if (a[now,j]<>1) then ok:=false; {A[I,J]=0:原本不通} 
end; { =2:曾走过} 

procedure init; {初始化} 
var i,j :integer; 
begin 
total:=0; {方案总数} 
zongbianshu:=0; {总边数} 
for i:=1 to max do 
for j:=1 to max do 
if a[i,j]<>0 then begin inc(bianshu);inc(zongbianshu);end; 
{求与每一边连接的边数bianshu} 
zongbianshu:=zongbianshu div 2; {图中的总边数} 
end; 

procedure find(dep,nowpoint:integer); {dep:画第几条边;nowpoint:现在所处的顶点} 
var i,next,j:integer; 
begin 
for i:=1 to bianshu[nowpoint] do {与当前顶点有多少条相接,则有多少种走法} 
if ok(nowpoint,i,next) then begin {与当前顶点相接的第I条边可行吗?} 
{如果可行,其求出另一端点是NEXT} 
a[nowpoint,next]:=2; a[next,nowpoint]:=2; {置成已走过标志} 
path[dep]:=next; {记录顶点,方便输出} 
if dep < zongbianshu then find(dep+1,next) {未搜索完每一条边} 
else output(dep); 
path[dep]:=0; {回溯} 
a[nowpoint,next]:=1; a[next,nowpoint]:=1; 
end; 

begin 
init; {初始化,求边数等} 
for first:=1 to max do {分别从各个顶点出发,尝试一笔画} 
fillchar(path,sizeof(path),0); 
path[0]:=first; {记录其起始的顶点} 
writeln(’from point ’,first,’:’);readln; 
find(1,first); {从起始点first,一条边一条边地画下去} 
end. 

    银行家算法其实是很普通的但是比较经典的算法,每本OS的书上都讲的,主要用来防止产生死锁的, 

    形象的讲:银行发放贷款(对不同的客户,有分期贷的)不能使有限可用资金匮乏而导致整个银行无法运转,也就是说每次请求贷款时,银行要考虑他能否凭着贷款完成项目还清贷款使银行运转正常, 

    (借用flyingcoolhwak写的步骤) 

    令Request(i)是进程P(i)请求向量,如果Request(i)[j]=k,则进程P(i)希望请求j类资源k个。 

    算法步骤如下: 

    1、如果Request(i)>Need(i)则出错(请求量超过申报的最大量),否则转2、 

    2、如果Requdst(i)>Available则P(i)等待,否则转3、 

    3、系统对P(i)所请求的资源实施试探分配,更改数据结构中的数值 

    4、Available<-Available-Request(i) 
       Allocation(i)<-Allocation(i)+Request(i) 
       Need(i)<-Need(i)-Request(i) 

    5、执行安全性算法(如下),如果是安全的则承认试分配,否则废除试分配,让进程P(i)等待 

    货郎担问题 

    问题描述 

    欧几里德货郎担问题是对平面给定的n个点确定一条连结各点的、闭合的游历路线问题。图1(a)给出了七个点问题的解。Bitonic旅行路线问题是欧几里德货郎担问题的简化,这种旅行路线先从最左边开始,严格地由左至右到最右边的点,然后再严格地由右至左到出发点,求路程最短的路径长度。图1(b)给出了七个点问题的解。 

    请设计一种多项式时间的算法,解决Bitonic旅行路线问题 

只有注册用户登录后才能发表评论。


网站导航: